1.求水仙花数
算法:暴力,枚举
题目:水仙花数是指一种三位数,其各个数之立方和等于该数。列出100-999内所有水仙花数。
思路:按照题意写循环。对每个数,先分离各个位的数字→求立方和→判断是否等于该数。如果是,输出。
C语言风格:
//one
#include<stdio.h>
int main(){
int x,y,z,i;
for(i=100;i<=999;i++){
x=i/100;
y=(i-100*x)/10;
z=i%10;
if((x*x*x+y*y*y+z*z*z)==i)
printf("%d ",i);
}
return 0;
}
//two
#include<stdio.h>
#include<math.h>
int main(){
int x,y,z,i;
for(i=100;i<=999;i++){
x=i/100;
y=(i-100*x)/10;
z=i%10;
if((pow(x,3)+pow(y,3)+pow(z,3))==i)
printf("%d ",i);
}
return 0;
}
C++语言风格:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int x,y,z,i;
for(i=100;i<=999;i++){
x=i/100;
y=(i-100*x)/10;
z=i%10;
if((pow(x,3)+pow(y,3)+pow(z,3))==i)
cout<<i<<' ';
}
return 0;
}
输入:无
输出:153 370 371 407
2.求质数
算法:数论-素数筛
题目:列出1-100之内所有质数。
质数:因子仅有1和它本身。
对算法的优化:2是最小的质数,不必从1开始枚举;一个合数,最大的因子是它的平方根。(减少了枚举量,节省了代码运行的时间和空间)
C语言风格:
#include<stdio.h>
#include<math.h>
int main(){
int flag=0,i,j;
for(i=2;i<100;i++){
flag=0;//不要忘记,每次判断之后要将标记变量flag归零
for(j=2;j<=sqrt(i);j++){
if(i%j==0)
flag++;
}
if(flag==0)
printf("%d ",i);
}
return 0;
}
C++语言风格:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int flag=0,i,j;
for(i=2;i<100;i++){
flag=0;
for(j=2;j<=sqrt(i);j++){
if(i%j==0)
flag++;
}
if(flag==0)
cout<<i<<' ';
}
return 0;
}
输入:无
输出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
3.ASCII与大小写
输入一个大写字母,输出其对应小写字母和小写字母的ASCII码。
算法:模拟
分析:ASCII码,大写字母的比小写字母的小32。
C语言风格:
//input1
#include<stdio.h>
#include<math.h>
int main(){
char ch;
int x;
scanf("%c",&ch);
ch+=32;
x=(int)ch;
printf("%c %d",ch,x);
return 0;
}
//input 2
#include<stdio.h>
#include<math.h>
int main(){
char ch;
int x;
ch=getchar();
ch+=32;
x=(int)ch;
printf("%c %d",ch,x);
return 0;
}
C++语言风格:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
char ch;
int x;
cin>>ch;
ch+=32;
x=(int)ch;
cout<<ch<<' '<<x;
return 0;
}
输入:A
输出:a 97
4.二维数组右移一列,最后一列移动到0列
题目:一个4行3列数组,对所有元素右移一列,最后一列元素移到0列。
算法:模拟
分析:按题意要求即可,注意数组从0行0列开始。多开一列,暂时存储最第3列。
建议动手推演
C语言风格:
#include<stdio.h>
#include<math.h>
int main(){
int a[4][4];
for(int i=0;i<=3;i++)//line
for(int j=0;j<=2;j++)//column
scanf("%d",&a[i][j]);
for(int i=0;i<=3;i++)//存储最后一列
a[i][3]=a[i][2];
for(int i=0;i<=3;i++)
for(int j=1;j>=0;j--)//j减少,防止覆盖
a[i][j+1]=a[i][j];
for(int i=0;i<=3;i++)
a[i][0]=a[i][3];
for(int i=0;i<=3;i++)
for(int j=0;j<=2;j++){
printf("%d ",a[i][j]);
if(j==2) printf("\n");
}
return 0;
}
C++语言风格:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int a[4][4];
for(int i=0;i<=3;i++)//line
for(int j=0;j<=2;j++)//column
cin>>a[i][j];
for(int i=0;i<=3;i++)//存储最后一列
a[i][3]=a[i][2];
for(int i=0;i<=3;i++)
for(int j=1;j>=0;j--)//j减少,防止覆盖
a[i][j+1]=a[i][j];
for(int i=0;i<=3;i++)
a[i][0]=a[i][3];
for(int i=0;i<=3;i++)
for(int j=0;j<=2;j++){
cout<<a[i][j]<<' ';
if(j==2) cout<<endl;
}
return 0;
}
输入:(略)
输出:(略)
5.数列
1)1-100 an=n;
2)1-1/2+2/3-3/4…+100/101
算法:模拟
分析:可以用循环求,也可以用有关公式;也可以在纸上手算出答案,代码中只写一个输出。
1)C语言风格:
#include<stdio.h>
#include<math.h>
int main(){
int i,sum=0;
for(i=1;i<=100;i++)
sum+=i;
printf("%d",sum);
return 0;
}
C++语言风格:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int i,sum;
for(i=1;i<=100;i++)
sum+=i;
cout<<sum;
return 0;
}
输入:无
输出:5051
- C语言风格
#include<stdio.h>
#include<math.h>
int flag=1;
double x,sum=1;
int main(){
for(x=1;x<=100;x++){
if(flag%2) sum-=x/(x+1);
else sum+=x/(x+1);
flag++;
}
printf("%lf",sum);
return 0;
}
C++语言风格
#include<cstdio>
int flag=1;
double x,sum=1;
int main(){
for(x=1;x<=100;x++){
if(flag%2) sum-=x/(x+1);
else sum+=x/(x+1);
flag++;
}
cout<<sum;
return 0;
}
输入:无
输出:1.301927
6.打折
(忘了题干长啥样了,略)
分析:分段函数,选择语句
7.一维数组折半查找
输入1个长度为n的升序数组,查找其中的元素x并输出x的数组下标。
算法:折半查找
C语言风格:
#include<stdio.h>
#include<math.h>
int a[233],n,mm,x,ans;
int bina(int a[], int n, int x){
int low=0,high=n-1,mid;
while(low<high){
mid=(low+high)/2;
mm=a[mid];
if(mm<x) low=mid+1;
else if(mm>x) high=mid-1;
else return mid;
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
ans=bina(a,n,x);
printf("%d",ans);
return 0;
}
C++语言风格:
#include<cstdio>
int a[233],n,mm,x,ans;
int bina(int a[], int n, int x){
int low=0,high=n-1,mid;
while(low<high){
mid=(low+high)/2;
mm=a[mid];
if(mm<x) low=mid+1;
else if(mm>x) high=mid-1;
else return mid;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>x;
ans=bina(a,n,x);
cout<<ans;
return 0;
}
8.最大最小
输入10个数,找出其中的最大值和最小值
算法:模拟
分析:挨个比较
优化:
C语言风格:
//数组
#include<stdio.h>
#include<math.h>
int a[233],maxn,minn;
int main(){
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
maxn=a[0],minn=a[0];
for(int i=1;i<10;i++){
if(a[i]>maxn) maxn=a[i];
if(a[i]<minn) minn=a[i];
}
printf("maxn=%d minn=%d",maxn,minn);
return 0;
}
C++语言风格:
//数组
#include<cstdio>
int a[233],maxn,minn;
int main(){
for(int i=0;i<10;i++)
cin>>a[i];
maxn=a[0],minn=a[0];
for(int i=1;i<10;i++){
if(a[i]>maxn) maxn=a[i];
if(a[i]<minn) minn=a[i];
}
cout<<"maxn="<<maxn<<' '<<"minn="<<minn;
return 0;
}
9.韩信点兵问题
韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 请编写程序计算韩信至少有多少兵。
算法:模拟
分析:按题意,转化为求余数相关问题
C语言风格:
#include "stdio.h"
void count(){
for(int n=1;;n++){
if((n%11==10)&&(n%7==4)&&(n%6==5)&&(n%5==1)){
printf("%d\n",n);
break;
}
}
}
int main(){
count();
return 0;
}
C++语言风格:
10.辗转相除求gcd(最大公约数)
算法:数论-辗转相除
C语言风格:
#include <stdio.h>
int main() {
printf("输入需要取最大公约数的两位正整数:");
int x,y,z;
scanf("%d %d",&x,&y);
if(x<y){//如果x<y,交换
int tmp;
tmp=x;
x=y;
y=tmp;
}
z=x%y;
while(z!=0) {//while循环,当z余数不为0时开始循环,当z为0时跳出循环体,并打印结果
x = y; //将上一个除数赋值为被除数
y = z; //将上一个余数赋值为除数
z =x%y; //开始取余
}
printf("%d" ,y);
return 0;
}
C++语言风格:
#include <cstdio>
int main() {
cout<<"输入需要取最大公约数的两位正整数:";
int x,y,z;
cin>>x>>y;
if(x<y){//如果x<y,交换
int tmp;
tmp=x;
x=y;
y=tmp;
}
z=x%y;
while(z!=0) {//while循环,当z余数不为0时开始循环,当z为0时跳出循环体,并打印结果
x = y; //将上一个除数赋值为被除数
y = z; //将上一个余数赋值为除数
z =x%y; //开始取余
}
cout<<y;
return 0;
}
11.指针法求10个正整数中最大数最小数
算法:
分析:
优化:
C语言风格:
#include<stdio.h>
int main(){
int a[10], i, max, min, * p;
p = a;
for (i = 0; i < 10; i++)
scanf("%d", p++);
max =[0], min = a[0];
for (p = a; p < a + 10; p++){
if (*p > max)
max = *p;
if (*p < min)
min = *p;
}
printf("max=%d\n", max);
printf("min=%d\n", min);
return 0;
}
C++语言风格:
#include<stdio.h>
int main(){
int a[10], i, max, min, * p;
p = a;
for (i = 0; i < 10; i++)
cin>>p++;
max =[0], min = a[0];
for (p = a; p < a + 10; p++){
if (*p > max)
max = *p;
if (*p < min)
min = *p;
}
cout<<"max="<<max<<endl<<"min="<<min<<endl;
return 0;
}
12.数组判断奇偶性
算法:模拟
分析:求余运算,分离奇数偶数。开三个数组:原数组、奇数组、偶数组
0是偶数,不能用0对数组进行初始化
C语言风格:
```c
#include<stdio.h>
int a[10],ji[10],ou[10];
int main(){
for(int i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<10;i++)
ji[i]=-1,ou[i]=-1;
int flag1=0,flag2=0,count=0;
while(count<10){
if(a[count]%2)
ji[flag1]=a[count],flag1++;
else ou[flag2]=a[count],flag2++;
count++;
}
for(int i=0;i<10;i++){
if(ji[i]!=-1) printf("%d ",ji[i]);
else{
printf("\n");
break;
}
}
for(int i=0;i<10;i++){
if(ou[i]!=-1) printf("%d ",ou[i]);
else {
printf("\n");
break;
}
}
return 0;
}
C++语言风格:
#include<cstdio>
#include<stdio.h>
int a[10],ji[10],ou[10];
int main(){
for(int i=0;i<10;i++){
cin>>a[i];
}
for(int i=0;i<10;i++)
ji[i]=-1,ou[i]=-1;
int flag1=0,flag2=0,count=0;
while(count<10){
if(a[count]%2)
ji[flag1]=a[count],flag1++;
else ou[flag2]=a[count],flag2++;
count++;
}
for(int i=0;i<10;i++){
if(ji[i]!=-1) cout<<ji[i]<<' ';
else{
cout<<endl;
break;
}
}
for(int i=0;i<10;i++){
if(ou[i]!=-1) cout<<ou[i]<<' ';
else {
cout<<endl;
break;
}
}
return 0;
}
13.排序:交换(指针)、冒泡
#include<stdio.h>
void swap(int*,int*);
int main(){
int a=1,b=2;
int*pa,*pb;
pa=&a;pb=&b;
swap(pa,pb);
return 0;
}
void swap(int*p1 ,int *p2){
int temp;
temp=*p1;
*p1=*p2 ;
*p2=temp ;
}
//冒泡排序:
//2.0基本冒泡排序
for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-i;j++)
if(a[j]<a[j+1]){
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
//2.1改进冒泡排序
bool bo;
int i=1;
do{
bo=true;
//for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-i;j++)
if(a[j]<[j+1]){
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
bo=false;
}
i++;
}while(!bo);