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;
}
}
}
这道题是我做过后觉得比较难的,可能算法并不是很简便,如果各位大神有什么好的方法请一定告诉我。
| 十一月 | ||||||
|---|---|---|---|---|---|---|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 26 | 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 | 1 | 2 | 3 | 4 | 5 | 6 |