一、设计一个程序,使之能够输入够从键盘任意输入一个正整数 n 要求:(1)求出它是几位数;(2)按逆序分别输出每一位数字; (3)计算 n 的每一位数字相加之和并输出。
例如输入 n=1234,则输出 n 是 4 位数,各位数字 是 4,3,2,1,数字之和为 10。
思路:在这个程序中,我们需要将数字倒过来排序,不如先想想怎么让它倒过来排。
因为我们不可能知道用户会输入几位数,不如我们从它的个位一点点取出来,于是我写成了这样:
long int num,a;
printf("Input a positive integer:");
scanf("%ld",&num);
printf("Each digit in reverse order:");
for(;num!=0;)
{
a=num%10;
printf("%ld ",a);
num/=10;
}
在这个程序中,我们每次都是将用户输入的数除以10取余,这样留下来的就是个位数,知道只剩个位,并输出出去,于是实现了从右往左的个位数剥离。再然后对原数值除以10,就把取出来的个位数砍掉了(因为C++不会保留小数点也不会自动四舍五入除非你手动加了函数)。并且以此循环往复。
然后再根据题目补足其他要求,这个时候就简单多了,最后写成了这样:
#include <stdio.h>
int main()
{
int cnt;
long int num,a,sum=0;
printf("Input a positive integer:");
scanf("%ld",&num);
printf("Each digit in reverse order:");
for(;num!=0;cnt++)
{
a=num%10;
printf("%ld ",a);
num/=10;
sum+=a;
}
printf("\nIt has %d digit,and the sum is %ld",cnt,sum);
return 0;
}
然后就实现题目中的效果。
二、一个正整数如果恰好等于它的因子之和,则称其为“完数”。编程找出1000以内的完数。
例如: 6 的因子是1,2,3而6=1+2+3
根据题意,我们首先要计算一个数的因子,而最经典的一种算法便是使一个数(a)去依次除以一个逐渐增大的数(i)。同时,为了控制范围,优化算法,我们可以使得运算到目的数的一半就停下。
比如:
int arr[20];
int a;
int now;
int sum;
for (int i = 1; i <= (a/2 +1); i++)
{
if (a % i == 0)
{
arr[now] = i;
sum+=i;
now++;
}
}
并且,我将计算得到的数存进数组arr当中,并对得到的因子求和以便下一步运算(对比目的数是否是因子之和)。
然后把目的数在1000以内寻找的条件置入,就变成了:
#include<stdio.h>
#include<math.h>
int main()
{
for(int a=2;a<=1000;a++)
{
int now=0;
int arr[64]={0};
int cnt=0;
int sum=0;
for (int i = 1; i <= (a/2 +1); i++)
{
if (a % i == 0)
{
arr[now] = i;
sum+=i;
now++;
}
}
if(sum==a)
{
printf("%d its factors are",a);
while(arr[cnt])
{
printf("%d ",arr[cnt]);
cnt++;
}
printf("\n");
}
}
return 0;
}
那么,这下当因子总和sum与数字a本身相符合时,就会输出对应结果,如果不符,那么for循环重置数组arr和各个计数器,就能防止出错了。
输出结果:
完
标签:10,ld,题目,int,sum,num,printf,程序设计,两道 From: https://blog.csdn.net/2402_88427700/article/details/143457549