C 打印大于平均值的数字之和
对于作业,我必须用C编写一个代码,打印大于平均值的数字 我已经写了一些代码,但当我插入一个数字或一个数字相同的数字(如555)时,它不会给我答案。如果是555-->5(和8->8,77->等),则应给出 我写的代码是: (我对我采取的每一步都发表了评论。)C 打印大于平均值的数字之和,c,sum,average,variable-assignment,C,Sum,Average,Variable Assignment,对于作业,我必须用C编写一个代码,打印大于平均值的数字 我已经写了一些代码,但当我插入一个数字或一个数字相同的数字(如555)时,它不会给我答案。如果是555-->5(和8->8,77->等),则应给出 我写的代码是: (我对我采取的每一步都发表了评论。) #包括 #包括 int main(int argc,char*v[]{ /*输入:1个介于1和2.000.000.000之间的数字*/ int n;/*存储该值*/ int ext,ext2;/*存储数字的副本*/ int rem;/*存储余
#包括
#包括
int main(int argc,char*v[]{
/*输入:1个介于1和2.000.000.000之间的数字*/
int n;/*存储该值*/
int ext,ext2;/*存储数字的副本*/
int rem;/*存储余数*/
int tot;/*存储数字总数*/
int avg;/*存储数字的平均值*/
int i;/*计算位数*/
int big;/*存储最大值和第二大值*/
scanf(“%d”和“&n”);
/*将数字分开并相加*/
ext=n;
ext2=n;
tot=0;
大=0;
平均值=0;
i=0;
while(ext!=0&&n=1){
rem=外部%10;
tot=tot+rem;
ext=ext/10;
i++;
};
/*平均值*/
平均值=tot/i;
/*查找并打印更高的数字*/
而(ext2>0){
rem=ext2%10;
如果(rem>平均值){
大+=快速眼动;
};
ext2=ext2/10;
}
如果(n9){
printf(“%d\n”,大);
}否则如果(大==平均值){
printf(“%d\n”,0);
}否则如果(大>=平均值){
printf(“%d\n”,大);
};
返回0;
}
希望有人能帮助我 您忘记用0初始化变量
i
。我已经更正了你的代码,它给出了预期的结果。对于一个数字,答案是0,因为一个数字的平均值总是数字本身,所以这个数字永远不会大于平均值
#include <stdio.h>
#include <stdlib.h>
int main ()
{
/* imput: 1 number between 1 and 2.000.000.000 */
int n; /* stores the value */
int ext, ext2; /* stores a copy of the number */
int rem, rem2; /* stores the remainders */
long tot; /* stores the total of the digits */
int avg; /* stores the average of the digits */
int i; /* counts the amount of digits */
int big, big2; /* stores the biggest and second biggest value */
int sum; /* stores sum of digits greater than average */
scanf("%d", &n);
/* seperate digits and add them */
ext=n;
ext2=n;
tot=0;
big=0;
big2=0;
avg=0;
i=0;
sum=0;
while(ext!=0 && n<2000000000 && n>=1)
{
rem=ext%10;
tot=tot+rem;
ext=ext/10;
i++;
};
/* average value */
avg=tot/i;
/* find and print higher numbers */
while(ext2>0)
{
rem2=ext2%10;
if(rem2>avg)
{
sum+=rem2;
};
ext2=ext2/10;
};
printf("sum of digits greater than average: %d",sum);
return 0;
}
#包括
#包括
int main()
{
/*输入:1个介于1和2.000.000.000之间的数字*/
int n;/*存储该值*/
int ext,ext2;/*存储数字的副本*/
int rem,rem2;/*存储余数*/
long tot;/*存储数字总数*/
int avg;/*存储数字的平均值*/
int i;/*计算位数*/
int big,big2;/*存储最大值和第二大值*/
int sum;/*存储大于平均值的数字之和*/
scanf(“%d”和“&n”);
/*将数字分开并相加*/
ext=n;
ext2=n;
tot=0;
大=0;
big2=0;
平均值=0;
i=0;
总和=0;
while(ext!=0&&n=1)
{
rem=外部%10;
tot=tot+rem;
ext=ext/10;
i++;
};
/*平均值*/
平均值=tot/i;
/*查找并打印更高的数字*/
而(ext2>0)
{
rem2=ext2%10;
如果(rem2>平均值)
{
总和+=rem2;
};
ext2=ext2/10;
};
printf(“大于平均值的位数总和:%d”,总和);
返回0;
}
除了未能初始化i=0代码>在i++之前
,您最大的问题是,大量不必要且难以描述的变量名让您感到困惑ext、ext2、tot、big、big2、avg、rem、rem2
只是一个变量
虽然您需要ext2
来保存变量的副本,您可以通过%
(模)来查找tot
和avg
,但不需要rem2
或big2
(您可以简单地重用rem
),您只需要一个big
(假设该变量包含大于平均值的位数之和)
此外,您查找big
(以及使用big2
)的循环比需要的要复杂得多。您不关心rem2
是否大于big2
,然后设置big2=rem2;
您关心的是数字是否大于avg
(就是这样),您只需要:
/* find and print higher numbers */
while (ext2>0){
rem = ext2 % 10;
if (rem > avg){
big += rem;
};
ext2 = ext2 / 10;
}
现在big
保存的数字总和大于平均值
重用变量和使用描述性变量名将大大有助于保持逻辑的简洁性,并防止不必要的变量扩展。编写函数时要记住一条正常的经验法则(最好始终记住),但如果您正在编写一个函数,并且发现自己使用的变量超过了4个,则可能需要重构程序。(这不是一条硬性规定,但关键是要防止您陷入的变量色拉)
为什么long tot;
?最多1+9+9+9+9+9+9+9+9=82
。使用int
就像您在其余变量中使用一样是可以的。(考虑到1≤你可能会得到一些否决票,因为它的格式看起来像是一个家庭作业转储。试着把它浓缩成一个特定的问题。你已经有了一个不起作用的测试用例的良好开端。我会用fgets
阅读输入,然后你就有了(ASCII)一个很好的数组中的数字。我来看看。这些可能需要特殊情况。一位数,平均数是数字,所以没有什么可添加的。例如5
,avg=5/1
,然后是大于5
的数字之和——没有任何数字大于5
。就像我说的,让我看看,然后我再发表评论或编辑我的答案@BramKoop为什么你说用777
结果应该是7
?用7+7+7=21
平均值是21/3=7
——没有比avg
更高的数字可以求和。你是说如果所有数字都相等,那么即使没有大的数字,你还有另一个特殊情况吗
#include <stdio.h>
int main (void) {
int n, /* stores the value */
tmp, /* stores a copy of the number */
rem, /* stores the remainders */
tot = 0, /* stores the total of the digits */
avg = 0, /* stores the average of the digits */
digits = 0, /* counts the number of digits */
big = 0; /* stores the sum of digits larger than avg */
/* imput: 1 number (1 <= n && n <= 2.000.000.000 */
if (scanf("%d", &n) != 1) { /* read/validate number */
fputs ("error: invalid integer input.\n", stderr);
return 1;
}
if (n < 1 || 2000000000 < n) { /* validate n in allowable range */
fputs ("error: input outside allowable value.\n", stderr);
return 1;
}
tmp = n;
while (tmp) { /* sum digits for average */
rem = tmp % 10;
tot += rem;
tmp /= 10;
digits++;
}
avg = tot / digits; /* calculate average */
tmp = n;
while (tmp) { /* sum numbers higher than avg */
rem = tmp % 10;
if (rem > avg)
big += rem;
tmp /= 10;
}
printf ("sum of digits greater than avg : %d\n", big);
}