1)求 Sn = a + aa + aaa + aaaa + .... + aaa...aaa(n个a) 的值
其中:n和a由键盘输入
例如:
n=5, a=2 ,则 Sn = 2 + 22 + 222 + 2222 + 22222
a1 = 2a1 = a
a2 = 22a2 = a1 * 10 + a
a3 = 222a3 = a2 * 10 + a
a4 = 2222a4 = a3 * 10 + a
...
an = a(n-1) * 10 + a
===>
#include <stdio.h>
int main()
{
int n,a;
scanf("%d%d", &n, &a );
int Sn = 0;
int an = 0;
int i;
for(i=0; i<n; i++)
{
an = an * 10 + a;
Sn = Sn + an;
}
printf("Sn = %d\n", Sn );
}
2)求1000以内的完数 [1,1000]
完数:除去这个数本身以外的所有因子之和 等于其本身
比如:
6的因子 1,2,3 (6本身除外)
6 == 1 + 2 + 3
(1)从1遍历到1000
(2)求每一个数的所有因子之和(本身除外)
(3)判断因子之和是否等于其本身
(4)满足条件就输出
int main()
{
int n,i;
int sum = 0;
for( n=1; n<=1000; n++ )
{
sum = 0;
for( i=1; i<n; i++ )//找因子 [1,n-1]
{
if( n%i == 0 )
{
sum = sum + i;
}
}
if( sum == n )
{
printf("%d\n", n);
}
}
}
3)一个正数有可能由n个连续的数相加得到的
比如:
15 = 1+2+3+4+5
15 = 4+5+6
15 = 7+8
从键盘上输入一个数n,然后找出所有情况的连续数
算法一:穷举法
1
1+2
1+2+3
1+2+3+4
1+2+3+4+5 == 15
先是以1开头找序列,一直累加,直到累加的结果等于15,那么就找到了,输出这种情况
如果小于15的话,就继续累加
如果大于15的话,就结束循环,从写一个数开始找
2
2+3
2+3+4
2+3+4+5
2+3+4+5+6 == 20 > 15
...
n/2
n/2 + n/2+1
n/2+1
n/2+1 + n/2+2 --> n+3 明显超过了
==》
int main()
{
int n;
scanf("%d", &n );
int sum = 0;
int i,j,k;
for( i=1; i<=n/2; i++ )
{
sum = 0;
for( j=i; sum <= n; j++ )
{
sum = sum + j;
if( sum == n )
{
//找到了
printf("%d = %d", n, i);
for( k=i+1; k<=j; k++)
{
printf(" + %d", k);
}
putchar('\n'); //putchar()输出一个字符//printf("\n");
}
}
}
}
算法二:
int main()
{
int l;//第一个开始加的数
int r;//下一个要加的数
int n;
scanf("%d", &n );
int sum = 0;
int k;
for( l=1,r=0; l<=n/2; )
{
if( sum < n )
{
r++; //5
sum = sum + r; // 2+3+4+5+6
}
else if( sum == n )
{
//找到了
printf("%d = %d", n, l);
for( k=l+1; k<=r; k++)
{
printf(" + %d", k);
}
putchar('\n');
//当以l开头的相加的数 输出完后,开始下一次 1+2+3+4+5
sum = sum - l; // 2+3+4+5
l++;
}
else if( sum > n )
{
sum = sum - l;
l++;
}
}
}