1.
亲密数_1
2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:
220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为:1+2+4+71+142=220
毕达哥拉斯把这样的数对称为相亲数。
相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
从键盘任意输入两个整数m和n,编程判断m和n是否是亲密数。若是亲密数,则输出“Yes!”,否则输出“No!”
程序运行示例1
Input m, n:
220,284↙
Yes!
程序运行示例2Input m, n:
224,280↙
No!
输入格式: "%d,%d"
输出格式:
输入提示信息:"Input m, n:\n"
输出提示信息:"Yes!\n"
"No!\n"
#include<stdio.h> judgeclose(a,b); main() { printf("Input m, n:\n"); int m,n; scanf("%d,%d",&m,&n); if(judgeclose(m,n)==1) printf("Yes!\n"); else printf("No!\n"); } judgeclose(a,b) { int i,j,k=0; int s[20]={0},t[20]={0},e[20]={0},f[20]={0}; for(i=1;i<=a;i++) for(j=2;j<a;j++) { if (i*j==a) { s[k]=i; t[k]=j; k++; } } for(i=1;i<=b;i++) for(j=2;j<b;j++) { if (i*j==b) { e[k]=i,f[k]=j; k++; } } int s1=0,s2=0; for(i=0;i<20;i++) { s1+=s[i]+t[i]; s2+=e[i]+f[i]; } s1=s1/2+1; s2=s2/2+1; if(s1==b&&s2==a) return 1; else return 0; }
看我写的这串垃圾代码。。。
要是考试肯定半个小时构思+写肯定写不完。。。
再看看同一类型题大神的方法:
2.
(链接)一个数对(x,y)是亲和数对,当且仅当 x 的非自身的因数之和等于 y,且 y 的非自身的因数之和等于 x。如果(x,y)是亲和数对,那么认为(y,x)是与之相同的亲和数对。若 A<=x<=B,则称亲和数对(x,y)在[A,B]范围内。现输入范围 A 和 B,求 [A,B] 内所有亲和数对个数。例如 [200,1200] 内有两个亲和数对 (220,284) 和 (1184,1210),因为 220 的非自身因数和 1+2+4+5+10+11+20+22+44+55+110=284,284 的非自身因数之和为 1+2+4+71+142=220。
解一:解法骨架是枚举 [A,B] 范围内所有 x,算出 x 的非自身正因数之和 y(y < x),若 y 的非自身因数之和为 x,则代表找到了一个亲和数对。于是得到了一个直观的朴素解法。
解二:但显然上述解法效率过低。为了避免重复计算,我们创建一个 res[x] 数组保存 x 的因子和。于是得到了比解一快得多的解法。
解三:但是上述解法仍然太慢。问题在哪里?容易知道,时间主要耗费在了计算因子上(% 和 / 是同一个CPU指令,耗费时间相同)。我们不妨换一种思维方式,枚举因子 i,并把因子 i 加到 res[i*j] 里面,当枚举结束时,res[x] 就是 x 的因子和。这个方法快在两个方面:(1)机器算乘法本来就比除法快;(2)没有多余的整除判断。于是我们得到了最快的解法,并且代码比上面两种解法更为简洁。下面的代码利用了全局变量默认为空,没有 memset(res, 0, sizeof res)。
#include <stdio.h> int res[100000005]; int main() { int A, B, ans=0; scanf("%d%d", &A, &B); for(int i = 1; i <= B; ++i) for(int j = 2; i*j <= 2*B; ++j) res[i*j] += i; for(int x = A; x <= B; ++x) if(res[x] > x && res[res[x]] == x) ++ans; printf("%d\n", ans); return 0; }
需要说明的是
(要运行这个程序,我们需要在C99并添加新的头文件或C++编译器下进行!)
于是差距就出现了:手动滑稽hhh
Plus:C++真的比C语言简便好多啊
From:Kai
3.
完全数
完全数(Perfect Number),又称完美数或完数,它是指这样的一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身,即m的所有小于m的不同因子(包括1)加起来恰好等于m本身。注意:1没有真因子,所以1不是完全数。计算机已经证实在10300以下,没有奇数的完全数。例如,因为6 = 1 + 2 + 3,所以6是一个完全数。
从键盘任意输入一个整数m,编程判断m是否是完全数。若m是完全数,则输出“Yes!”,并同时打印出每一个完美数的全部因子,以验证这个数确实是一个完美数。若m不是完全数,则输出“No!”
程序运行示例1
Input m:
28↙
Yes!
1,2,4,7,14
程序运行示例2
Input m:
6↙
Yes!
1,2,3
程序运行示例3
Input m:
1↙
No!
输入信息提示:"Input m:\n"
输入格式: "%d"
输出格式: "%d"
输出因子时用逗号间隔,格式为: ","
判断是完全数,输出信息提示:"Yes!\n"
判断不是完全数,输出信息提示: "No!\n"
//有了上一道题作为基础,这道题就显得很简单了//
#include<stdio.h> judgetrue(a); main() { printf("Input m:\n"); int m; scanf("%d",&m); judgetrue(m); } judgetrue(a) { int i,j,k=0; int s[20]={0},t[20]={0}; for(i=1;i<=a;i++) for(j=2;j<=a;j++) { if (i*j==a) { s[k]=i; t[k]=j; k++; } } int s1=0; for(i=0;i<20;i++) { s1+=s[i]; } if(s1==a) { printf("Yes!\n"); for(i=0;i<20;i++) { if(s[i]!=0) { printf("%d",s[i]); if(s[i+1]!=0) printf(","); } } } else printf("No!\n"); }
4.
五个水手在岛上发现一堆椰子,先由第1个水手把椰子分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。然后,第2个水手把剩下的4堆混合后重新分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。以后第3、4个水手依次按此方法处理。最后,第5个水手把剩下的椰子分为等量的5堆后,同样剩下1个给了猴子。请用迭代法编程计算并输出原来这堆椰子至少有多少个。
**输出格式要求:"y = %d\n"
#include "stdio.h" int can(int k) { int i; for (i=1;i<=5;i++) { if ((k-1)%5!=0||k< 5) return 0; k=(k-1)/5*4; } return 1; } int main() { int ans=1; while (!can(ans)) ans++; printf("y = %d\n",ans); return 0; }
5.求1000内的
#include<stdio.h> #define m 1000 judgetrue(a); main() { int i; for(i=2;i<=m;i++) judgetrue(i); } judgetrue(a) { int i,j,k=0; int s[100]={0}; for(i=1;i<=a;i++) for(j=2;j<=a;j++) { if (i*j==a) { s[k]=i; k++; } } int s1=0; for(i=0;i<100;i++) { s1+=s[i]; } if(s1==a) { printf("\n%5d\n",s1); for(i=0;i<20;i++) { if(s[i]!=0) { printf("%5d",s[i]); } } } else; }
你可以发现:我每个程序都是在原程序的基础上进行修改而成的。
所以我把这些程序上传在了这个博客上,以备后事之需。
1.
奥运参赛国出场次序:
输入奥运会参赛国国名,并按照字典序对其进行排序。
要求:参赛国数量不超过150个,每个国家的名字不超过9个字符。
提示:‘\0’占一个字符。
#include <string.h> #include <stdio.h> #define N 151 #define MAX_LEN 10 void SortString(char str[][MAX_LEN], int n); int main() { int i, n; char name[N][MAX_LEN]; printf("How many countries?"); scanf("%d",&n); getchar(); printf("Input their names\n"); for(i=0;i<n;i++) gets(name[i]); SortString(name, n); printf("Sorted results:\n"); for(i=0;i<n;i++) { puts(name[i]); } return 0; } void SortString(char str[][MAX_LEN], int n) { int i,j; char temp[MAX_LEN]; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(strcmp(str[j],str[i])<0) { strcpy(temp,str[i]); strcpy(str[i],str[j]); strcpy(str[j],temp); } } } }
2.
统计正整数中指定数字的个数
从键盘输入一个正整数number,求其中含有指定数字digit的个数。例如:从键盘输入正整数number=1222,若digit=2,则1223中含有 3个2,要求用函数实现。
函数原型为:int CountDigit(int number,int digit);
输入格式: "%d,%d"
输出格式:
输入提示信息:"Input m,n:\n"
输出格式:"%d\n"
#include<stdio.h> int CountDigit(int number,int digit); main() { printf("Input m,n:\n"); int m,n; scanf("%d,%d",&m,&n); printf("%d\n",CountDigit(m,n)); } int CountDigit(int number,int digit) { int c=0; while(number) { if(digit==number%10) {c++; number=number/10; } } return c; }
3.冒泡程序
#include<stdio.h> #define LEN 10 void bubble(int dat[], int length); main( ) { int data[LEN]={0}, i; for (i=0; i<= LEN-1; i++) { scanf("%d",&data[i]); } bubble(data,LEN); for(i=0; i<= LEN-1; i++) { printf("%8d", data[i]); } } void bubble(int dat[], int length) { int head, tail,round,i; int t; head = 0; tail = length - 1; for (round = head; round <= tail; round++) for (i = tail; i >= round+1; i--) if ( dat[i] < dat[i-1] ) { t=dat[i]; dat[i]=dat[i-1]; dat[i-1]=t; } }
4.实验题
编写程序统计从键盘输入的一行文本中各个字母的个数。
输入以回车键结束。
不区分大小写,大写字母与相应的小写字母按照同一个字母看待。
要求输出按照各个字母出现的个数从大到小进行排序,出现的个数相同的,按照字母在字母表中的先后顺序进行排序。
***输入格式:调用getchar()函数依次输入每个字符
***输出格式:"%c(%c):%d\n"
例如输入以下文本:
Hello World
程序将输出:
L(l):3
O(o):2
D(d):1
E(e):1
H(h):1
R(r):1
W(w):1
A(a):0
B(b):0
C(c):0
F(f):0
G(g):0
I(i):0
J(j):0
K(k):0
M(m):0
N(n):0
P(p):0
Q(q):0
S(s):0
T(t):0
U(u):0
V(v):0
X(x):0
Y(y):0
Z(z):0
#include <stdio.h> #include<stdlib.h> void bubble_sort(int a[], int c[],int n); int main(void) {int i; int c[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; char j; char a; int b[26]={0}; int count[26]={0}; while ((a = getchar()) != '\n') { for (j='A';j<='Z';++j) { if (a == j || a == j+32) { b[j-'A']++;count[j-'A']++; } } } bubble_sort(b,c,26); for (i=0;i<26;++i) { printf("%c(%c):%d\n",c[i]-32,c[i],b[i]); } } void bubble_sort(int a[],int c[], int n) { int i, j, temp; for (j = 0; j < n - 1; j++) for (i = 0; i < n - 1 - j; i++) { if(a[i] < a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; temp = c[i]; c[i] = c[i + 1]; c[i + 1] = temp; } } }
这道题是我做过后觉得比较难的,可能算法并不是很简便,如果各位大神有什么好的方法请一定告诉我。
十一月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |