1、一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
方法一:
分析: 土办法,从1到10000遍历,符合两个条件的即为所求。
#include <stdio.h>
#include <math.h>
int main(){
int i,x,y;
for(i=1;i<10000;i++)
{
x=sqrt(i+100);
y=sqrt(i+268);
if(x*x==i+100 && y*y==i+268)
printf("%d+100=%d*%d\n",i,x,x);
}
}
运行结果:
21+100=11*11
261+100=19*19
1581+100=41*41
--------------------------------
Process exited after 0.5004 seconds with return value 0
请按任意键继续. . .
方法二:
分析:
假设该数为 x。m和n分别为m2和n2的算术平方根。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数。绝对不可以全是奇数,例如33=9,55=9;(奇 * 奇=奇,奇 * 偶=偶,偶 * 偶=偶)
4、可得: (i + j) =2m, (i - j)=2n,所以(i+j)和(i-j)全为偶数。(奇+奇=偶,奇-奇=偶,偶+偶=偶,偶-偶=偶),所以i 和 j 要么都是偶数,要么都是奇数。
5、又由3知i和j至少有一个为偶数,所以i和j全为偶数。
6、又由2知ij=168,所以i和 j均大于等于2。
7、于是题目就转化为已知,i和j均为大于1的偶数,ij=168,m=(i+j)/2,n=(i-j)/2,x+100=nn,x+268=mm这6个条件的问题了
#include <stdio.h>
int main(void)
{
int i, j, m, n, x;
for (i = 1; i <=168; i++)
{
if(i%2==0) //确定i是偶数
{
j=168/i;
if(j%2==0)//确定j是偶数
{
if(i>j&&i*j==168)//确定i*j=168,为防止i和j颠倒,设置i>j.
{
n=(i-j)/2;
m=(i+j)/2;
x=n*n-100;
x=m*m-268;
printf("%d+100=%d*%d\n",x,n,n);
printf("%d+268=%d*%d\n",x,m,m);
printf("===============\n" );
}
}
}
}
}
运行结果:
-99+100=1*1
-99+268=13*13
===============
21+100=11*11
21+268=17*17
===============
261+100=19*19
261+268=23*23
===============
1581+100=41*41
1581+268=43*43
===============
--------------------------------
Process exited after 0.3052 seconds with return value 0
请按任意键继续. . .
2、有五个学生,每个学生有4门课的成绩,从键盘输入以上数据(包括学生号,姓名,4门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件“student”中。
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int ID;
int math;
int English;
int C;
int python;
int avargrade;
char name[20];
}Stu;
int main()
{
FILE *fp;
Stu stu[5];
int i,avargrade=0;
printf("请输入5个同学的信息:学生号,姓名,4门成绩:\n");
for(i=0;i<5;i++)
{
scanf("%d %s %d %d %d %d",&(stu[i].ID),stu[i].name,&(stu[i].math),&(stu[i].English),&(stu[i].C),&stu[i].python);
stu[i].avargrade=(stu[i].math+stu[i].English+stu[i].C+stu[i].python)/4;
}
if((fp=fopen("student.txt","w"))==NULL)
{
printf("error :cannot open file!\n");
exit(0);
}
for(i=0;i<5;i++)
fprintf(fp,"%d %s %d %d %d %d %d\n",stu[i].ID,stu[i].name,stu[i].math,stu[i].English,
stu[i].C,stu[i].python,stu[i].avargrade);
fclose(fp);
system("pause");
return 0;
}
运行结果:
请输入5个同学的信息:学生号,姓名,4门成绩:
1 谷歌 10 10 10 10
2 的数据 10 10 10 10
3 辅导班 11 11 11 11
4 地方 22 22 22 22
5 地的 55 55 55 55
请按任意键继续. . .
3、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出500以内的所有完数。
分析:依次for循环从1到500遍历,找出每个数的所有因子,判断这些因子之和是否等于此数,若等于则是完数。
注:数本身不是因子。
#include<stdio.h>
int main() {
int i,j,s,k;
int a[200];
for(i=1; i<=500; i++) {
s=0;
k=0;
for(j=1; j<i; j++) {
if(i%j==0) {
a[k++]=j;
s=s+j;
}
}
if(s==i) {
for(int n=0; n<k-1; n++) {
printf("%d+",a[n]);
}
printf("%d=%d\n",a[k-1],i);
}
}
}
运行结果:
1+2+3=6
1+2+4+7+14=28
1+2+4+8+16+31+62+124+248=496
--------------------------------
Process exited after 1.831 seconds with return value 0
请按任意键继续. . .
4、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
分析:分子为斐波那契数列,每一项为前两项之和,从2开始。分母也是斐波那契数列,从1开始。
#include<stdio.h>
int main(){
float a=2,b=1,s=0,t;
for(int i=1;i<=20;i++)
{
s=s+a/b;
t=a;
a=a+b;//后一个分数的分子为前一个数分子和分母之和,分母为前一个数的分子。
b=t;
}
printf("%.6f\n",s);
}
运行结果:
32.660263
--------------------------------
Process exited after 1.499 seconds with return value 0
请按任意键继续. . .
5、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n;当输入n为奇数时,调用函数 1/1+1/3+…+1/n(利用指针函数)。
#include<stdio.h>
float even(int n)
{
int i;
float sum=0;
for(i=2;i<=n;i=i+2)
{
sum+=(float)1/i;
}
return sum;
}
float odd(int n)
{
int i;
float sum=0;
for(i=1;i<=n;i=i+2)
{
sum+=(float)1/i;
}
return sum;
}
int main()
{
int n;
float t;
float (*p)(int); //p是一个指向函数的指针变量
printf("请输入一个数:");
scanf("%d",&n);
if(n%2==0)
p=even;
else
p=odd;
t=(*p)(n); //note:写法
printf("%.2f",t);
return 0;
}
运行结果:
请输入一个数:4
0.75
--------------------------------
Process exited after 3.825 seconds with return value 0
请按任意键继续. . .
6、利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,70-89分之间的用B表示,60-70分之间的用C表示,60以下的用D表示。
方法1:
#include<stdio.h>
int main() {
int s;
printf("请输入你的成绩:") ;
scanf("%d",&s);
if(s>=90) {
printf("A");
}
if(70<=s&&s<90) {
printf("B");
}
if(60<=s&& s<70) {
printf("C");
}
if(s<60) {
printf("D");
}
}
运行结果:
请输入你的成绩:1000
A
--------------------------------
Process exited after 2.693 seconds with return value 0
请按任意键继续. . .
方法2:
#include<stdio.h>
int main(){
int s;
char g;
printf("请输入学习成绩:");
scanf("%d",&s);
g=(s>=90)?'A':(s>=70?'B':(s>=60)?'C':'D');
printf("%c",g);
}
运行结果:
请输入学习成绩:99
A
--------------------------------
Process exited after 4.177 seconds with return value 0
请按任意键继续. . .
7、求一个4*4矩阵对角线元素之和。
#include<stdio.h>
int main(){
int a[4][4],i,j,k;
int s=0;
for(i=0;i<4;i++)
{ printf("请输入矩阵第%d行元素:",i+1);
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("该矩阵的对角元素分别为:" );
for(k=0;k<4;k++){
s=s+a[k][k];
printf(" %d ",a[k][k]);
}
printf("\n该矩阵的对角元素之和为:%d",s);
}
运行结果:
请输入矩阵第1行元素:1 2 3 4
请输入矩阵第2行元素:1 2 3 4
请输入矩阵第3行元素:1 2 3 4
请输入矩阵第4行元素:1 2 3 4
该矩阵的对角元素分别为: 1 2 3 4
该矩阵的对角元素之和为:10
--------------------------------
Process exited after 14.72 seconds with return value 0
请按任意键继续. . .
8、给一个不多于6位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
分析:利用取余可得个位,取整得除个位以外的位,将一个数的各位分割开来。
例如345623 对10取余得个位,对10取整得十、百、千、万、十万位。
即
第一次循环为:3,34562
第二次循环为:2,3456
第三次循环为:6,345
第四次循环为:5,34
第五次循环为:4,3
第六次循环为:3,0
此时n=0,循环结束。
#include<stdio.h>
int main() {
char a[6][10]= {"个","十", "百","千","万","十万"};
int i=0,n;
printf("请输入一个不大于6位的整数:");
scanf("%d",&n);
while(n!=0)
{
printf("%s位为:%d\n",&a[i],(n%10));//依次从个位输出
n=n/10;//得个位以上;
i++;//计算有几位
}
printf("==============");
printf("总共%d位",i);
}
运行结果:
请输入一个不大于6位的整数:345623
个位为:3
十位为:2
百位为:6
千位为:5
万位为:4
十万位为:3
==============总共6位
--------------------------------
Process exited after 15.84 seconds with return value 0
请按任意键继续. . .
9、求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如3+33+333+3333+33333(此时 共有5个数相加),几个数相加有键盘控制。
#include<stdio.h>
int main() {
int s=0,a,b,n;
int c[n];
printf("请分别输入数字和位数(以空格间隔):");
scanf("%d %d",&a,&n);
b=a;
for(int i=0; i<n; i++) {
c[i]=a;
s=s+a;
a=a*10+b;
}
for(int i=0; i<n-1; i++) {
printf("%d+",c[i]);
}
printf("%d=%d",c[n-1],s);
}
请分别输入数字和位数(以空格间隔):3 4
3+33+333+3333=3702
--------------------------------
Process exited after 7.882 seconds with return value 0
请按任意键继续. . .
10、将一个正整数分解质因数。例如:输入42,打印出42=237。
分析:通过取余运算先找出可以整除此正整数的因子,每找到一个因子就通过取整将此正整数缩小
#include<stdio.h>
int main() {
int i,n;
scanf("%d",&n);
printf("%d=",n);
for(i=2; i<=n; i++) {
while(n%i==0) { //找到一个因子
printf("%d",i);
n=n/i;//缩小
if(n!=1)
{
printf("*");
}
}
}
}
756
756=2*2*3*3*3*7
--------------------------------
Process exited after 3.489 seconds with return value 0
请按任意键继续. . .