day01改进:
完数可以用欧拉公式:
如果一个数n为质数,并且2^n-1为质数,那么(2^n-1)*2^(n-1)为完全数。
用时3h .....
- 计算字符串中含有的不同字符的个数
编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内(0-127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不做统计。多个相同的字符只计算一次。 数据范围:1<=n<=500
思路:
-
知识补充:
- 0表示空格
- 127表示删除
- 换行符的ASCII码对应十进制为10.
-
思路1
- 逐个输入字符串中的字符
- 统计所有字符的个数
- 将每个字符对应的值填入相关数组的下标。
- 遇到换行符就结束
具体实现:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int n=0;
bool str[128]={false};
char ch;
while((ch=getchar())!='\n')
{
n++;
if(n<1||n>500)
{
printf("个数不符合规定!");
exit(0);
}
int i=ch-1;
str[i]=true;
}
int sum=0;
int i;
for(i=0;i<128;i++)
{
if(str[i]==true)
sum++;
}
printf("%d",sum);
return 0;
}
难点:
- 不会输入连续字符串
在循环内出不来while((ch=getchar())!=EOF) { n++; if(n<1||n>500) { printf("个数不符合规定!"); exit(0); } int i=ch-1; printf("%d ",i); str[i]=true; }为什么呢? 因为ch=getchar()虽然返回的是int型,但是不对应十进制。 getchar(),putchar(),因此ch仍需要与char型的进行比较
4.从键盘输入两个数字n,m,求解m和n的最小公倍数。
思路:
- 最大公约数和最小公倍数的含义。
- 最大公约数是两个数都能整除的最大值。
- 最小公倍数是两个数共有的倍数的最小值。
- 思路1
- 最小公倍数=两个数的乘积/最大公约数
- 最大公约数利用辗转相除法。大数除小数,余数找除数。
或者利用图形理解
-
使用循环
- (a,b)=(b,a%b)
- 设a,设b,设r 若r不为0,a=b,b=r;r=a%b 最后当r为0 返回b
-
利用递归
具体实现:
int GCD(int n,int m)
{
int a,b;
if(n>m)
{
a=n;
b=m;
}
else
{
a=m;
b=n;
}
int r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int GCD1(int a,int b)
{
return b?GCD1(b,a%b):a;
//不用考虑大小的原因是因为在第一次可以进行颠倒
}
int GCD2(int a,int b)
{
if(b==0)
return a;
return GCD2(b,a%b);
}