#include <stdio.h>
#include <stdlib.h>
// 设每天早上没吃之前的个数为 x 吃掉 x/2 + 1, 没吃的等于 x -(x/2 +1), 第十天早上剩一个,反推回去即可
// x - (x/2 + 1) = left, x/2 -1 = left , x = (left + 1)*2
int main(){
int sum = 1, i;
for(i=10; i > 0; i--) {
printf("第%d天早上没吃的时候的个数 = %d\n", i, sum);
sum = (sum + 1)*2;
}
return 0;
}
1724c-exercise-example19
参考答案中的迭代次数利用了以下结论:假设有一个正整数N,对于 N/2 < a < N,a 不可能是 n 的因子。因为可以推导出 1<N/a<2,所以迭代范围缩小为 i<=N/2。
可以对以上情形进行推广,假设有一个正整数N,N 的所有因子为 a0 a1 ... an,且 a0<a1<...<an,则有以下结论:若 a1 为 N 的因子,则 N/a1 也是 n 的因子,且 N=a0*an=a1*an-1=...。对于 an-1<i<an,i 不可能是 N 的因子;因为可以推导出 a0=N/an<N/i<N/an-1=a1,a0 和 a1 范围内不存在N的因子。所以在确定了 a 是 N 的因子之后,则可以确定 N 的另一个因子 N/a,且迭代范围可以缩小为i<N/a。
#include <stdio.h>
int perfect(int n)
{
int s=1, t=n, i;
for(i=2; i<t; i++)
{
if(n % i == 0)
{
t = n / i;
s += i;
if(t != i) s += t;
}
}
if(n==s) return 1;
else return 0;
}
int main()
{
int i, j, t;
for(i=1; i<1001; i++)
{
if(perfect(i))
{
printf("%d=1", i);
t = i;
for(j=2; j<t; j++)
{
if(i % j == 0)
{
t = i / j;
printf("+%d+%d", j, t);
}
}
printf("\n");
}
}
}
1723c-exercise-example19
参考方法:
#include<stdio.h>
int Perfect(int n);
int main(void)
{
int i,j,count;
for(i = 1; i <= 1000; i++)
{
if(Perfect(i))
{
count = 1;
printf("%d=",i);
for(j = 1; j < i; j++)
{
if(i % j == 0 && count == 1)
{
printf("%d",j);
count++;
}
else if(i % j == 0 && count != 1)
{
printf("+%d",j);
count++;
}
}
printf("\n");
}
}
return 0;
}
int Perfect(int n)
{
int sum = 0;
for(int i = 1; i < n; i++)
{
if(n%i == 0)
sum += i;
}
if(n == sum)
return 1;
else
return 0;
}
1722c-exercise-example19
参考代码:
#include <stdio.h>
#define MAXNUMBER 1000
int main()
{
int sum, x, i;
for(x = 1; x <= MAXNUMBER; x++){
sum = 0;
for(i = 1; i <= x/2; i++)
if(x%i == 0)
sum += i;
if(sum == x)
printf("%d\n", x);
}
return 0;
}
1721c-exercise-example18
使用递归方法:
#include <stdio.h>
#include <math.h>
int sumN(int a, int i);//返回i个a
int main()
{
int sum = 0, a, n, i;
printf("请输入 a 和 n:\n");
scanf("%d %d", &a, &n);
for (i = 1; i <= n; ++i)
{
sum += sumN(a,i);
}
printf("a+aa+...=%d", sum);
return 0;
}
int sumN(int a, int i)
{
if (i >= 1) return sumN(a, i - 1) + a*pow(10,i-1);
else return 0;
}
1725c-exercise-example21
参考解法:
1724c-exercise-example19
参考答案中的迭代次数利用了以下结论:假设有一个正整数N,对于 N/2 < a < N,a 不可能是 n 的因子。因为可以推导出 1<N/a<2,所以迭代范围缩小为 i<=N/2。
可以对以上情形进行推广,假设有一个正整数N,N 的所有因子为 a0 a1 ... an,且 a0<a1<...<an,则有以下结论:若 a1 为 N 的因子,则 N/a1 也是 n 的因子,且 N=a0*an=a1*an-1=...。对于 an-1<i<an,i 不可能是 N 的因子;因为可以推导出 a0=N/an<N/i<N/an-1=a1,a0 和 a1 范围内不存在N的因子。所以在确定了 a 是 N 的因子之后,则可以确定 N 的另一个因子 N/a,且迭代范围可以缩小为i<N/a。
1723c-exercise-example19
参考方法:
1722c-exercise-example19
参考代码:
1721c-exercise-example18
使用递归方法: