查找出最大数值是在几行几列
#include <stdio.h>
int main()
{
int row,cloum,max;//row是第几行(从0记起)cloum是第几列(从0记起),max是最大数值
int a[3][4]={{1,2,3,4},{9,8,7,6},{10,-10,5,7}};//赋予初值
max = a[0][0];
for (int i = 0; i <=2 ; i++) {//行
for (int j = 0; j <=3 ; j++) {//列
if (a[i][j] > max){//判断
max = a[i][j];
row = i+1;
cloum = j+1;
}
printf("%d\t",a[i][j]);
}
printf("\n");
}
printf("max:%d\nrow:%d\ncolum: %d",max,row,cloum);
return 0;
}
将a[n]进行排序
#include <stdio.h>
int main()
{
int j,i,k;//j,i单独,k是替代
int a[10]={4654,987,654,23,654,56487,98,61,654,654};//赋予初值(也可以用scanf输入)
for (int i = 0; i <=9 ; i++) {//9次排序排为正确的顺序
for (int j = 0; j <=9 ; j++) {//一次排序
if (a[j]<a[j+1]){//进行换位
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}
printf("number:");
for (int i = 0; i <=9 ; i++) {//依次输出a[10]的值
printf("%d\t",a[i]);
}
return 0;
}
三个数最大值
版本一
#include <stdio.h>
int main(int x,int y,int z)
{
int max(int x,int y,int z);//自定义函数
int a,b,c,d;
scanf("%d%d%d",&a,&b,&c);//储存
d=max(a,b,c);
printf("max=%d",d);
return 0;
}
int max(int x,int y,int z)//定义自定义函数
{
int m;
if (x>y&&y>z)m=x;
if (x>z&&z>y)m=x;
if (z>y&&y>x)m=z;
if (z>x&&x>y)m=z;
if (y>x&&y>z)m=y;
if (y>z&&z>x)m=y;
return (m);
}
版本二
作业选做题
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
鸣谢燕山大学穆运峰老师补充数据!
#include <stdio.h>
int main()
{
int a,b,c,d,e,f;//d是a输入的分钟数,e是溢出的小时数,f是溢出后的分钟数
scanf("%d%d",&a,&b);
c=a/100;//分离出小时的位数;
d=a%100;//分离出分钟数;
if (d+b>=60){//判断是否大于60分钟 大于的情况
e=(b+d)/60;//溢出多少小时
f=b+d-e*60;//剩下的分钟数
c=c+e;//总的小时数
printf("%d%02d",c,f);
}
else if (b+d<=-60){//小于负60的情况
e=(b+d)/60;//算出来是负数,少了多少小时
f=b+d-e*60;//算出来是负数
c=c+e-1;//最终的小时
f=60+f;//最终的分钟数
printf("%d%02d",c,f);
}
else if(b+d>-60&&b+d<0){//为负数的情况
c=c-1;
f=60+b+d;
printf("%d%02d",c,f);
}
else{//b+d不超过60也不为负数
printf("%d%02d",c,b+d);
}
return 0;
}
定义函数求两数最大值(int)
#include <stdio.h>
int max( int a, int b );//定义函数在后面就要声明函数
//求两个数的最大值(int类型)
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("max = %d\n", max(a, b));
return 0;
}
int max(int a,int b)//定义函数的函数体
{
int z;
if(a>b)z=a;
else z=b;
return (z);
}
三天打鱼两天晒网
#include <stdio.h>
int main()
{
int i=1,j=3,d=5,a;//a是输入的值
scanf("%d",&a);
/* i<= <=j是打鱼
* i+5与j+5
* j< <d
* j+5与d+5*/
if (a>0&&a<=1000) {//判断是否是正整数
for (;d<=1000;) {
if (a>=i&&a<=j){//打鱼 1 2 3 天打鱼+5
printf("Fishing in day %d",a);break;
}
if (a>j&&a<=d){//晒网 4 5天晒网+5
printf("Drying in day %d",a);break;
}
d+=5;
i+=5;
j+=5;
}
}
return 0;
}
用仅学的顺序结构,和出现过的最大值最小值定义函数写出排序
#include <stdio.h>
int main() {
int max(int a,int b);
int min(int a,int b);
int a, b, c, d, e, f, g, h,l,j,k,m,n;//g是首位,h是第二位
scanf("%d %d %d %d", &a, &b, &c, &d);
e=max(a,b);//a,b最大的一个
f=max(c,d);//c,d最大的一个
g=max(f,e);//最大的一个
h=min(a,b);//a,b最小的一个
l=min(c,d);//c,d最小的一个
j=min(l,h);//最小的一个
k=max(l,h);//最小中最大的一个数
if (g==f){//e小于k
if (k>e)printf("%d %d %d %d",g,k,e,j);
else printf("%d %d %d %d",g,e,k,j);
}
if (g==e){//e小于k
if (k>f)printf("%d %d %d %d",g,k,f,j);
else printf("%d %d %d %d",g,f,k,j);
}
return 0;
}
int max(int a,int b){
int z;
if (a>b)z=a;
if (b>a)z=b;
return z;
}
int min(int a, int b){
int z;
if (a>b)z=b;
if (b>a)z=a;
return z;
}
#include <stdio.h>
int main()
{
int a,b,c,d,e,f[4];
scanf("%d %d %d %d",&a,&b,&c,&d);
f[0]=a;
f[1]=b;
f[2]=c;
f[3]=d;
for (int j = 0; j <=3 ; j++) {
for (int l = 0; l <=2 ; l++) {
if (f[l]<f[l+1])
{
e=f[l];
f[l]=f[l+1];
f[l+1]=e;
}
}
}
for (int m = 0; m <=3 ; m++) {
printf("%d ",f[m]);
}
return 0;
}
猜大小
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
srand(time(0));
int a,b,c=0;
a=(int)rand()%100+1;
printf("%d",a);
while (c<=3)
{
scanf("%d",&b);
if (b>a)printf("你猜大了\n");
else if (b<a)printf("你猜小了\n");
else if (b==a)
{
printf("恭喜猜对了\n");
break;
}
c++;
if (c==3)
{
printf("你已经猜过三次了\n");
break;
}
}
return 0;
}
注意
time.h中的函数
time()是取系统时间;
stdlib.h中的函数
srand()时初始化随机数
为什么这样做
rand()%100+1
确保了随机数在1~100
输入十位数和转换进制(简易表达,不能输出ABC的进制位数)
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c,d,n,m=0;//a是输入的十位数字,b是进制转换的
while(scanf("%d %d",&a,&b)==2)
{
n=0;
m=0;
for (int j=1;j; j++) {//进制的转换后的算法
c=a%b;//算出低位的数字
d=a/b;//最终判断终止条件
a=d;//a是除下来的数
m=c*pow(10,n)+m;
n+=1;
if (d==0)
{
printf("%d\n",m);
break;
}
}
}
return 0;
}
进制之间的转换运算
输出各个位数优化版
#include<stdio.h>
int main()
{
int b,d=10,c=1,n,m,e;
scanf("%d",&b);
e=b;
do {//计算有几位数
b=b/10;
n=n+1;
}
while (b>0);//不满足条件就停止
m=n;
int a[n];
for (int i = 0; i <=n-1; i++) {
a[i]=e%d/c;//优化了分离出各个位数的数字
d*=10;
c*=10;
}
for (int j = 0; j <=n-1 ; j++) {
printf("%d\n",a[j]);//这里只是
}
return 0;
}
其中
a[i]=e%d/c是自动化储存的实现
输入年月日,输出是这年的第几天
#include <stdio.h>
int main()
{
int a,b,c,n=0,m;
int d[2][12]={{1,2,3,4,5,6,7,8,9,10,11,12},{31,29,31,30,31,30,31,31,30,31,30,31}};
int e[2][12]={{1,2,3,4,5,6,7,8,9,10,11,12},{31,29,31,30,31,30,31,31,30,31,30,31}};
//a是输入的年,b是输入的月份,c是输入的日,n是一年中的第几天,m是一个月内取到的天
scanf("%d %d %d",&a,&b,&c);
if (a%4==0 &&c <=d[1][b-1]){
if (b-1==0)printf("这个是第:%d天\n",c);
else if (b-1!=0) {
m=d[1][b-1]-c;
for (int j = 0; j <= b - 1; j++) {
n = d[1][j] + n;//累加的天数
}
printf("这个是第:%d天\n",n-m);
}
}
else if (a%4!=0 && c>=e[1][b-1]){
if (b-1==0)printf("这个是第:%d天\n",c);
else if (b-1!=0) {
m=e[1][b-1]-c;
for (int j = 0; j <= b - 1; j++) {
n = e[1][j] + n;//累加的天数
}
printf("这个是第:%d天\n",n-m);
}
}
if (c>d[1][b-1]||c>e[1][b-1])printf("你确定你输入的是正确日期?");
return 0;
}
- 注意润年和平年
- 注意输入日期是正确的日期
- 没了
输入的数字进行逆序
//输入逆序的另一种算法
#include <stdio.h>
int main()
{
int a,c;
scanf("%d",&a);//a是输入的数字
c=0;
do {
c=a%10+c*10;//低位成为高位
a=a/10;//除去低位数字(最后一位)
} while (a!=0);//条件成立才循环(易错为a==0)
printf("逆序是:%d",c);
return 0;
}
/*
* 1.需要注意的算法就在do{}while()的循环中
* 2.与数组不同的是,只用循环
* 3.指针也可以达到相同的效果,但是原理上也是这个算法
* 4.如果要单独的分离出各个位数,然后排序后组成一个数,建议还是使用数组
*/
s=阶乘和的算法
#include <stdio.h>
int main()
{
int Jie(int a);
int s=0,n,i,d=0;
scanf("%d",&n);
for (i = 1; i <=n ; i++) {
s=s+Jie(i);
}
printf("%d",s);
return 0;
}
int Jie(int a){
int z=1;
for (int i = 1; i <=a ; i++) {
z=z*i;
}
return z;
}
全数的输出
所谓完数,是指它的因子之和刚好是其本身的正整数。如6的因子是1,2,3,而1+2+3=6,所以6是完数,且是最小的完数。 现在,用户输入N,请输出N以内的所有完数。
输入格式:
一个正整数N(6<=N<=10000)。
输出格式:
输出N以内的所有完数,一个完数占一行。
输入样例1:
100
输出样例1:
6
28
#include <stdio.h>
int main(){
int a,s,b,c;//s是要输出的完数,c是因子和
scanf("%d",&a);
if (a>=6&&a<=10000){
for (int i = 6; i<=a; i++) {
s=i;
c=0;
for (int j = 1; j <s ; j++) {
if (s%j==0){
b=j;
c=c+b;
}
}
if (c==s)printf("%d\n",s);
}
}
return 0;
}
谁是小偷
7-7 推理-找出罪犯 (10 分)
法官审理一起盗窃案时,四名嫌疑犯的a,b,c,d的供述如下: a:罪犯在b,c,d三人之中。 b:我没有作案,是c偷的。 c:在a和d中有一个是罪犯。 d:b说的是事实。 经调查,四人中有两人说了真话,并且罪犯只有1人。请确定真正的罪犯。
输入格式:
无
输出格式:
The criminal is a,b,c,d之中的一个.
输入样例:
无
输出样例:
The criminal is a(或b,c,d,给出真正的犯罪).
#include <stdio.h>
int main(){
int a,b,c,d;//a指向bcd,b和d都指向c,c指向ad
//归纳 b和d时同体,不同时成立为假,同时成立也为假,b和d只能为假
for (int a = 0; a < 2; a++) {
for (int b = 0; b < 2; b++) {
for (int c = 0; c < 2; c++) {
for (int d = 0; d < 2; d++) {
if (a+b+c+d==1) {//逻辑判断,不是罪犯就0
if ((b == 1 || c == 1 || d == 1) + 2 * ((b == 0||d==0) && c == 1) + (a == 1 || d == 1) == 2) {//俩句话说的对!
/*b==1 和d==1时 c一定
* b==0和d==0时 c一定不
* a==1和d==1 俩只能来一个
* 第一种表示b和d是关联的,只有一种情况
* 第二种表示b和d是关联的,有俩情况
* 第三种表示a和d的,但是d和b是有关联的
* */
if (a){printf("The criminal is a.");break;}
if (b){printf("The criminal is b.");break;}
if (c){printf("The criminal is c.");break;}
if (d){printf("The criminal is d.");break;}
}
}
}
}
}
}
return 0;
}
质因数分解
7-6 质因数分解 (15 分)
请编写程序,输入一个正整数 n(1<n<231),对其进行质因数分解,输出分解结果。
输入样例
6618848
输出样例
6618848 = 2^5 * 17 * 23^3
1
#include <stdio.h>
#include <math.h>
int main() {
int a,n;
scanf("%d",&a);
if (a>1&&a<pow(2,31)){
printf("%d = ",a);
for (int i = 2; i <= a; i++) {
if (a%i==0){
printf("%d",i);
n=0;
while (a%i==0){
a/=i;
n+=1;
if (n>1&&a%i!=0)printf("^%d",n);
}
if (a!=1)printf(" * ");
}
}
}
return 0;
}
输出菱形
7-4 输出菱形图案 (15 分)
用户输入一个正整数N(1<=N<=10)和一个字符a,输出由a组成的菱形图案,图案共有2N-1行。
输入格式:
一个正整数N(1<=N<=10)和一个字符a,N和a之间无空格。
输出格式:
由字符a组成的菱形图案,共2N-1行。
输入样例:
3$
输出样例:
$
$$$
$$$$$
$$$
$
#include <stdio.h>
int main(){
int N;
char c;
scanf("%d%c",&N,&c);
for(int i=1;i<=N;i++){
for(int j=1;j<=N-i;j++){
printf(" ");
}
for(int k=1;k<=2*i-1;k++){
printf("%c",c);
}
printf("\n");
}
for(int i=N-1;i>0;i--){
for(int j=N-i;j>0;j--){
printf(" ");
}
for(int k=2*i-1;k>0;k--){
printf("%c",c);
}
printf("\n");
}
}
附赠失败的错误思想和失败案例
#include <stdio.h>
#include <math.h>
int main()
{
int n=1;//
double pi=0.0,i=1.0,k,team;
while (n>=0)
{
team=1/n;//
k=-team;//k是改变team的符号的
pi=pi-k;//一样的
n=n+2;
i=i+1;//位数的判断
if (fabs(team)<1e-6)break;//判断条件
}
pi=4*pi;
printf("number:%f\npi:%10.8f",i,pi);
return 0;
}
真确样本
#include <stdio.h>
#include <math.h>
int main()
{
int sign=1;//sign用于符号的改变
double pi=0.0,n=1.0,team=1.0;
while (fabs(team)>=1e-6)//知道team<1e-6停止
{
pi=pi+team;//总式子
n=n+2;//除法中要用到的
sign = -sign;//改变符号
team=sign/n;//就是判别的条件
}
pi = 4*pi;//pi的估计值
printf("%10.8f",pi);//8位小数的显示
return 0;
}
自己的正确break样本
#include <stdio.h>
#include <math.h>
int main()
{
double n;//n是第几个数
double pi=0.0,i=1.0,k;//pi是估算值,i是控制公式的符号,k是公式
for (n = 1.0; n >= 0;) {
k=i/n;
i=-i;
pi=pi+k;
n=n+2;
if (fabs(k)<=1e-6)break;
}
pi=4*pi;
printf("number:%f",pi);
return 0;
}
这个输出为3.141595
自己的二度错本
#include <stdio.h>
#include <math.h>
int main()
{
double n;//n是第几个数
double pi=0.0,i,k;//pi是估算值,i是控制公式的符号,k是公式
for (n = 1.0; n >= 0;) {
k=-1/n;
i=-k;
k=i;
pi=pi+k;
n=n+2;
if (fabs(i)<=1e-6)break;
}
pi=4*pi;
printf("number:%f",pi);
return 0;
}
这个输出为4.000000
分段函数的成功样本
#include <stdio.h>
int main()
{
int i,j,k;//i是分段第三段的公式,k是第n-1的函数值,j是n-2的函数值
for (int n = 1,j=1,k=1; n <= 40; n++) {
while (n<=2){//先把前两段的输出出来
printf("number:%d\n",i=1);
n=n+1;
}
i=k+j;//公式
j=k;//j等于n-1的函数值(相当于下一次的n-2)
k=i;//等于n的函数值(相当于下一次的n-1)
printf("number:%d\n",i);
}
return 0;
}
俩个月后的兔子总数
#include <stdio.h>
int main()
//下两个月的兔子有几只问题
{
int i,j,k;//i是分段第三段的公式,k是第n-1的函数值,j是n-2的函数值
for (int n = 1,j=1,k=1; n <= 40; n+=2) {
while (n<=2){
printf("number:%d\n",i=1);
n=n+2;
}
i=k+j;//公式
j=i;//j等于n的函数值(相当于下一次的n-2)
k=i+k;//等于n+1的函数值(相当于下一次的n-1)
printf("number:%d\n",i);
}
return 0;
}
特别好看的分布图
#include <stdio.h>
int main()
{
int i,j,k;//i是分段第三段的公式,k是第n-1的函数值,j是n-2的函数值
for (int n = 1,j=1,k=1; n <= 40; n++) {
while (n<=2){//先把前两段的输出出来
printf("number:%d\t",i=1);
n=n+1;
}
i=k+j;//公式
j=k;//j等于n-1的函数值(相当于下一次的n-2)
k=i;//等于n的函数值(相当于下一次的n-1)
printf("number:%d\t",i);
if (n%4==0)printf("\n");
}
return 0;
}
输出效果
D:\untitled3\cmake-build-debug\untitled3.exe
number:1 number:1 number:2 number:3
number:5 number:8 number:13 number:21
number:34 number:55 number:89 number:144
number:233 number:377 number:610 number:987
number:1597 number:2584 number:4181 number:6765
number:10946 number:17711 number:28657 number:46368
number:75025 number:121393 number:196418 number:317811
number:514229 number:832040 number:1346269 number:2178309
number:3524578 number:5702887 number:9227465 number:14930352
number:24157817 number:39088169 number:63245986 number:102334155
进程已结束,退出代码0
错误的唯一循环判断
#include <stdio.h>
int main()
{
int id[51],k[51];
int i,j,l=1;
for (int i = 1; i <=50 ; i++) {
printf("ID:");
scanf("%d",&id[i]);
for (int j = 1; j <=50 ; j++) {
if (k[l]==id[i]){
printf("no!the number:%d",l);
break;
} else {
k[l] = id[i];
while (l == 50) {
printf("ID:%d", k[l]);
}
}
l++;
}
}
return 0;
}
改正
#include <stdio.h>
int main() {
//先执行内循环,循环体系是从内到外的
int Y = 100, x, y, z;
for (int x = 1; x <= 100; x++) {
for (int y = 1; y <= 100; y++) {
for (int z = 1; z <= 100; z++) {
if (5 * x + 3 * y + 1 / 3 * z == 100 && x + y + z == 100)printf("x=%d\ty=%d\tz=%d\n",x,y,z);//判断条件成立才输出
}
}
}
return 0;
}
求一排数的最大值减最小值
#include <stdio.h>
int main(){
int a,b,c,d,s;//a是最大值,c是最小值,d是交换的数值,s是差
scanf("%d",&a);//先输入
c=a;
if (a>=0&&a<1000) {
while (scanf("%d ", &b) == 1) {//后输入的
if (b>=0&&b<1000) {
if (a <= b) {
d = a;
a = b;
b = d;
}
if (c >= b) {
d = c;
c = b;
b = d;
}
}
else {
c=0;
break;
}
}
s=a-c;
} else s=0;
printf("%d",s);
return 0;
}
输出质因数
#include <stdio.h>
#include <math.h>
int main(){
int a,n=0;
scanf("%d",&a);
if (a>1&&a<pow(2,31)) {
if (a <= 3) {
printf("%d = %d",a,a);
} else {
printf("%d = ", a);
for (int i = 2; i <= a; i++) {
n = 0;
if (a % i == 0 && i != a)printf("%d", i);
while (a % i == 0) {//判断是几次方
a = a / i;
n += 1;
if (n > 1 && a % i != 0) {
printf("^%d", n);
if (a !=0)printf(" * ");
}
if (n == 1 && a % i != 0) {
if (a != 1&&a != 2&&a != 3)printf(" * ");
}
}
}
}
}
return 0;
}
会多输出一个*
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,n=0;
scanf("%d",&a);
/*质因数的含义
* 比如48=24*2 就可以写为24=3*8 总的就可以写为48=2^4*3
* */
if (a>1&&a<pow(2,31))//判断范围
{
printf("%d = ",a);//格式开头的输出 数字 =
for (int i = 2; i ; i++) {//这个是负责找出数字的
if (a%i==0)//找到符合的数字(求余为0满足时质因数)
{
n=0;
printf("%d",i);//输出想要的数字,看看使得否有几次方
for (;a%i==0; )
{
a/=i;//看看有几次方
n+=1;
if (n>1&&a%i==1)printf("^%d",n);
}
if (a!=1)printf(" * ");
}
if (a==1)break;
}
}
return 0;
}
没有解决没有质因数的东西
查找范围内的素数
#include <stdio.h>
#include <math.h>
int n;
int su(int a);
int ci(int a);
int main(){
int a,b;
scanf("%d %d",&a,&b);
n=b;
printf("=%d",su(a));
return 0;
}
int su(int a){//范围内的素数,从大到小
int z=a;
int s=0;
for (int j = a; j>1 ; j--) {
for (int i = 2;i<=j;i++) {
if (j % i ==0 && i==j) {
printf("%d", i);
z = i;
n--;
if (z>1&&n>0)printf("+");
if (n==0||z<=2)break;
break;
}
}
if (n==0)break;
s+=z;
}
return s;
}
乱输出
for(a=t;a>1;a--){
for(s=1,count=0;n<=a;s++){
if(a%s==0){
count++;
}
}
if(count==2){
printf("%d ",a);
}
}
for(a=t;a>1;a--){
for(s=1,count=0;s<=a;s++){
if(a%s==0){
count++;
}
}
if(count==2){
printf("%d ",a);
n--;
if (z>1&&n>0)printf("+");
if (n==0||z<=2)break;
break;
}
if (n==0)break;
s+=z;
}
int t,b,s,c=0,z,e;
scanf("%d",&t);
for(b=t;b>1;b--){
for(s=1,c=0;s<=b;s++){
if(b%s==0){
c++;
}
}
if(c==2){
printf("%d ",b);
z=b;
n--;
if (z>1&&n>0)printf("+");
if (n==0||z<=2)break;
continue;
}
if (n==0)break;
e+=z;
}
没按要求输出的
#include <stdio.h>
int n;
int su(int a);
int main(){
int a,b;
scanf("%d %d",&a,&b);
n=b;
printf("=%d",su(a));
return 0;
}
int su(int a){//范围内的素数,从大到小
int t,b,count=0,z,s;
for(int j=a;j>1;j--){
for(b=1,count=0;b<=a;b++){
if(j%b==0){
count++;
}
}
if(count==2){
printf("%d",j);
z=j;
n--;
if (a>1&&n>=1)printf("+");
s+=z;
}
if (n==0)break;
}
return s;
}
所以谨慎而行不要耍这些小聪明