4.1循环结构

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++;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值