两个C语言编程题,对C语言只有那么头疼了。教求高手的指点。

编程打印用“偶数”构成的n行下三角三角形,行数n从键盘输入。
【输入形式】一个整数
【输出形式】参见样例
【样例输入】5
【样例输出】

2
4 6
8 10 12
14 16 18 20
22 24 26 28 30

从键盘输入两个正整数,输出这两个整数的商,要求商的小数点后保留30位整数。例如输入355和113,输出3.141592920353982300884955752212
【输入形式】两个整数,逗号作分隔符
【输出形式】参见样例
【样例输入】355,113
【样例输出】3.141592920353982300884955752212

第1个回答  2011-09-30
第一题:
int main()
{
unsigned int n,m,i,num;
num = 2;
scanf("%d", &n);
for ( i = 1; i <= n; ++i)
{
for ( m = 1; m <= i; ++m, num+=2 ) printf("%d ", num);
printf("\n");
}
return 0;
}

第二题:
#include <stdio.h>

void div(int a, int b, int n, char* ans)
{
int last_d = 0;

if (( a > 0 && b < 0 ) || ( a < 0 && b > 0 ))
{
*(ans++) = '-';
}

a = a > 0 ? a : -a;
b = b > 0 ? b : -b;

// 1. Integer part
ans += sprintf(ans, "%d", a/b);

if ( n >= 0 ) *(ans++) = '.';

// 2. Float part
while ( --n > 0 )
{
a %= b; a *= 10;
if ( a < b ) *(ans++)='0';
else ans += sprintf(ans, "%d", a/b);
}

// 3. Last digit is a special case
if ( n == 0 )
{
a %= b; a *= 10;
last_d = a/b;
a %= b; a *= 10;
last_d += ( a / b >= 5 ) ? 1 : 0;
ans += sprintf(ans, "%d", last_d) ;
}

*ans = '\0';
}

int main()
{
char s[60];
int a, b;
scanf("%d,%d", &a, &b);
div(a, b, 30, s);
printf("%s\n", s);

return 0;
}
第2个回答  2011-09-30
int i;
sanf("%d", &i);
int num = 2;
for (int line = 0; line < i; line ++) {
for (int column = 0; column < line + 1; column ++) {
printf("%d ", num);
num += 2;
}
printf("\n");
}

第二题:
int main() {
int divisor;
int dividend; // 被除数
scanf("%d %d", $dividend, &divisor); // $换成&,我输入失败
if (divisor <= 0 || dividend < 0) {
printf("input error!");
return 1;
}
printf("%d", dividend/divisor);
dividend = (dividend % divisor) * 10;
if (!dividend) return 0;
printf(".");
for (int index = 0; index < 30; index++) {
printf("%d", dividend/divisor);
dividend = (dividend % divisor) * 10;
if (!dividend) break;
}
return 0;
}追问

谢谢您的提点!请问您能为我解释一下第二题为什么要这样编写吗?我不太理解为什么要这样编写

追答

这和你笔算除法立竖式是一个道理,你对应着立竖式读一读代码就明白了

刚还想到一个效率更高的方法,可是因为修改次数太多,提交不了啦,这里顺便发出来,不过看来你更看不懂了
#include
#include
int main() {
long divisor;
long dividend; // 被除数
scanf("%ld %ld", $dividend, &divisor); // $换成&,我输入失败
if (divisor <= 0 || dividend < 0) {
printf("input error!");
return 1;
}
printf("%d", dividend/divisor);
dividend = dividend % divisor;
if (!dividend) return 0;
int digit = sizeof(long) - 1;
long factor = pow(10, digit);
char decimals[30 + digit + 1];
printf(".");
divisor *= factor;
for (int index = 0; dividend && index < 30; index+=digit) {
dividend *= factor;
sprintf(factor + index, "%d", dividend/divisor);
dividend %= divisor;
}
decimals[index] = decimals[30] = 0;
printf("%s", decimals);
return 0;
}
没编译,可能有错,但就是这个理儿

本回答被提问者采纳
第3个回答  2011-09-30
1、
#include<stdio.h>
int main()
{
int n=0;
int i,j;
int s=1,sum=0;
scanf("%d",n);
for(i=1;i<=n;i++)
for(j=1;j<=s;j++){sum=sum+2;printf("%d ",sum);if(j==s)printf("\n");s++;}
return 0;
}
第二题要是大数相除,等会要上班,晚点再帮你写出来~!追问

谢谢!

追答

#include
int main()
{
int n=0;
int i,j;
int s=0,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
s++;
for(j=1;j<=s;j++){sum=sum+2;printf("%d ",sum);if(j==s)printf("\n");}
}
return 0;
}
第一题修改一下~!不好意思!

相似回答