//M1 int main(){ int n; scanf("%d", &n); int a[n][n] = {1}, i, j; for(i=1; i<n; i++){ a[i][0] = 1; for(j=1; j<i; j++){ a[i][j] = a[i-1][j-1] + a[i-1][j]; } a[i][j] = 1; } } //M2 int main(){ int n; scanf("%d", &n); int a[n+1][n+1] = {0, 1}, i, j; for(i=1; i<n; i++){ for(j=1; j<i; j++){ a[i][j] = a[i-1][j-1] + a[i-1][j]; } } }翻译
时间: 2024-04-29 14:20:10 浏览: 7
这两段代码都是用来生成杨辉三角的。杨辉三角是一个三角形的数字表,由一列数字 1 开始,之后每个数字都是它上方两个数字之和。这里是针对不同的输入 n,生成不同的 n 行杨辉三角。
M1 中,程序先读入一个整数 n,然后定义一个 n 行 n 列的数组,初始化第一行为 1。接下来使用两个 for 循环,计算每一行的数字。每行的第一个和最后一个数字都是 1,其他数字是它上一行相邻两个数之和。这段代码没有输出结果,只是生成了杨辉三角。
M2 中,程序与 M1 类似,但数组的大小是 n+1 行 n+1 列,初始化第二个元素为 1。计算每一行的数字时,只需要计算前 i-1 行的数据即可,因为第 i 行的数据只与前一行有关。这段代码也没有输出结果,只是生成了杨辉三角。
相关问题
#include "stdio.h" #define N 10 #include "math.h" int passway ( int n, int n1, int* pn ); main() { int n,n1,pn1; int time; scanf("%d %d",&n,&n1); time=passway(n,n1,&pn1); if(time>0) printf("%d %d %d",pn1,N-pn1,time); else printf("error!"); } int passway( int n, int n1, int* pn ) { int t1[10],t2[10]; int i,j; int n2=n-n1; int m1=n1,m2=n2*3; int m[10],min=n2; if(n<0||n1>n) return 0; else { for(i=1;i<10;i++) { if(n1%i==0) t1[i]=n1/i; else t1[i]=n1/i+1; for(j=10-i;;) { if(n2%j==0) t2[i]=(n2/j)*3; else t2[i]=(n2/j+1)*3; m[i]=(t1[i]>t2[i])?t1[i]:t2[i]; } if(m[i]<min){ min=m[i]; pn=i; } } return min; } } 改进上面代码中passway函数部分
在这段代码中,passway函数的逻辑较为混乱,可以考虑进行如下的改进:
1. 将变量的命名更改为有意义的名称,方便理解和维护。
2. 将计算最小时间的逻辑提取出来,形成一个单独的函数,便于复用和维护。
3. 减少不必要的循环,提高代码效率。
改进后的代码如下:
```c
#include <stdio.h>
#include <math.h>
int get_min_time(int n1, int n2, int i, int* pn) {
int t1 = (n1 % i == 0) ? n1 / i : n1 / i + 1;
int j = 10 - i;
int t2 = (n2 % j == 0) ? n2 / j * 3 : (n2 / j + 1) * 3;
int m = (t1 > t2) ? t1 : t2;
if (m < *pn) {
*pn = i;
}
return m;
}
int passway(int n, int n1, int* pn) {
int n2 = n - n1;
if (n < 0 || n1 > n) {
return 0;
}
int min_time = n2 * 3;
for (int i = 1; i < 10; i++) {
int m = get_min_time(n1, n2, i, pn);
if (m < min_time) {
min_time = m;
}
}
return min_time;
}
int main() {
int n, n1, pn;
int time;
scanf("%d %d", &n, &n1);
time = passway(n, n1, &pn);
if (time > 0) {
printf("%d %d %d", pn, 10 - pn, time);
} else {
printf("error!");
}
return 0;
}
```
改进后的代码更易读、易懂,且运行效率更高。
#include<stdio.h> int HmsToS(int h, int m, int s) { int t; t=60*60*h+60*m+s; return t; } void PrintTime(int s) { int h=0,m=0; while(s>=60) { if(s>=3600) { h++; s=s-3600; } if(s<3600 && s>=60) { m++; s=s-60; } } printf("%02d:%02d:%02d\n",h,m,s); } int main() { int h,m,s,t,h1,m1,s1; while(scanf("%d:%d:%d\n",&h,&m,&s),!=EOF); { scanf("%d:%d:%d",&h1,&m1,&s1); t=HmsToS(h1,m1,s1)-HmsToS(h,m,s); PrintTime(t); } return 0; }为什么没有东西输出,请你帮我修改一个
您的代码中有一个多余的分号,导致程序无法正常读取输入。另外,注意在使用scanf时应该加上&符号,正确读取变量的地址。
下面是修改后的代码:
```
#include<stdio.h>
int HmsToS(int h, int m, int s) {
int t;
t=60*60*h+60*m+s;
return t;
}
void PrintTime(int s) {
int h=0,m=0;
while(s>=60)
{
if(s>=3600)
{
h++;
s=s-3600;
}
if(s<3600 && s>=60)
{
m++;
s=s-60;
}
}
printf("%02d:%02d:%02d\n",h,m,s);
}
int main() {
int h,m,s,t,h1,m1,s1;
while(scanf("%d:%d:%d",&h,&m,&s)!=EOF)
{
scanf("%d:%d:%d",&h1,&m1,&s1);
t=HmsToS(h1,m1,s1)-HmsToS(h,m,s);
PrintTime(t);
}
return 0;
}
```
注意,scanf("%d:%d:%d\n",&h,&m,&s)这样的写法是错误的,因为回车符不属于整数,需要去掉。