1、 计算电池电压
设计一个程序,读入给定的电池数据文件,提取出其中的 v1~v18 组电池电压数据,并计算每行的总电压,输出“行号 总电压”。
程序仅需进行一个文件的计算,群文件中会提供一个示例 文件,但此文件仅供参考格式,数据及数据组数没有参考意义。
文件绝对路径:/home/RunSpace/4011.txt 文件权限为只读
输入:无
输出:1、格式为“行号(及 IDX) 总电压”,每行数据占
一行;
2、总电压格式输出为三位小数。
样例输入
IDX STEP WORK TIME LOOP ALARM Cur Vol Cap Tmp v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24
1 1 44 00:10:01 1 80 -6.00 230.00 0.99 0.00 12.789 12.787 12.765 12.774 12.792 12.784 12.799 12.799 12.785 12.790 12.783 12.788 12.762 12.793 12.799 12.775 12.782 12.722 0.010 0.005 0.004 0.002 0.002 0.008
2 1 44 00:20:01 1 80 -6.00 226.70 1.99 0.00 12.702 12.693 12.683 12.690 12.695 12.698 12.714 12.702 12.698 12.701 12.699 12.692 12.687 12.704 12.697 12.692 12.694 12.630 0.002 0.007 0.011 0.002 0.003 0.009
3 1 44 00:30:01 1 80 -6.00 224.90 2.99 0.00 12.600 12.596 12.582 12.578 12.603 12.593 12.606 12.600 12.592 12.597 12.591 12.590 12.581 12.601 12.604 12.592 12.589 12.526 0.008 0.005 -0.002 0.012 0.018 0.007
4 1 44 00:40:01 1 80 -6.00 222.90 3.99 0.00 12.486 12.485 12.465 12.471 12.482 12.487 12.493 12.494 12.491 12.484 12.484 12.481 12.472 12.491 12.496 12.484 12.477 12.409 0.006 0.011 0.003 0.014 0.001 0.001
5 1 44 00:50:01 1 80 -6.00 220.90 4.99 0.00 12.369 12.360 12.353 12.358 12.360 12.368 12.383 12.374 12.360 12.368 12.368 12.361 12.357 12.373 12.365 12.349 12.367 12.300 0.005 0.005 0.006 0.006 0.003 0.008
6 1 44 01:00:01 1 80 -6.00 218.60 5.99 0.00 12.236 12.230 12.224 12.230 12.230 12.235 12.254 12.246 12.235 12.237 12.237 12.236 12.221 12.245 12.246 12.227 12.233 12.171 0.006 0.006 0.007 0.007 0.001 0.009
7 1 44 01:10:01 1 80 -6.00 216.20 6.99 0.00 12.105 12.098 12.079 12.085 12.095 12.099 12.112 12.112 12.098 12.095 12.098 12.097 12.082 12.105 12.106 12.088 12.095 12.032 0.007 0.005 0.006 0.006 0.005 0.010
8 1 44 01:20:02 1 80 -6.00 213.40 7.99 0.00 11.950 11.947 11.938 11.934 11.940 11.957 11.966 11.957 11.951 11.952 11.944 11.947 11.941 11.952 11.952 11.947 11.952 11.874 0.006 0.010 0.005 0.002 0.007 0.007
9 1 44 01:30:02 1 80 -6.00 210.60 8.99 0.00 11.797 11.799 11.782 11.778 11.789 11.805 11.811 11.808 11.797 11.802 11.792 11.790 11.792 11.805 11.796 11.795 11.799 11.716 0.010 0.011 0.003 0.003 0.010 0.008
10 1 44 01:40:00 1 80 -6.00 207.70 9.99 0.00 11.634 11.638 11.616 11.614 11.626 11.640 11.649 11.646 11.635 11.632 11.624 11.629 11.628 11.637 11.636 11.636 11.627 11.549 0.011 0.006 0.003 0.008 0.008 0.005
样例输出
1 230.068
2 228.471
3 226.621
4 224.632
5 222.493
6 220.173
7 217.681
8 215.001
9 212.253
10 209.296
#include <stdio.h> char s[1000]; double x = 0,sum = 0; int cnt = 0; int main() { FILE *fp; fp = fopen("/home/RunSpace/4011.txt","r"); int i; for (i = 0; i < 34; i++) fscanf(fp,"%s",s); while (fscanf(fp,"%s",s) != EOF) { sum = 0; for (i = 0; i < 9; i++) { fscanf(fp,"%s",s); } for (i = 0; i < 18; i++) { fscanf(fp,"%lf",&x); sum += x; } cnt ++; printf("%d %.3f\n",cnt,sum); for (i = 0; i < 6; i++) { fscanf(fp,"%s",s); } } fclose(fp); return 0; }
2、 24点plus
使用逆波兰表达式的方法计算 24 点中的算式,输入 4 个数字,输出最接近 24 点的答案,如果有两个同样接近的,输出较
小的一个。
数字的顺序可以改变,可以使用加减乘除参与运算。
有多组数据参与运算,每组数据占一行。
输入:每行 4 个数字,以空格间隔
输出:最接近 24 的数字,每组输出占一行,结果保留 3 位小数
输入示例:
10 18 20 15
15 3 5 14
4 16 13 4
14 15 4 8
19 16 4 2
输出示例:
24.000
24.000
23.250
23.286
23.125
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #define eps 1e-8 5 6 char a[10], b[10], c[10], d[10],s[100]; 7 char operate[4] = {‘+‘,‘-‘,‘*‘,‘/‘}; 8 int fin[1000]; 9 double dig[1000]; //数字栈 10 char ope[1000]; //运算符栈 11 int pri[1000]; //存储运算符优先级 12 13 int Create(char[], char[], char[], char[], char, char, char); 14 int Calculate(char *); 15 int getdig(int, int); 16 double cal(double, double, char); 17 int FullArray(int, int, int); 18 void pop(void); 19 20 double min; 21 int flag,flagless = 0; 22 int digtop, opetop; 23 24 int main() 25 { 26 int i, j, k; 27 28 pri[‘+‘] = pri[‘-‘] = 0; 29 pri[‘*‘] = pri[‘/‘] = 1; 30 31 while(scanf("%s",a) != EOF) 32 { 33 flag = flagless = 0; 34 min = 1000; 35 scanf("%s%s%s",b, c, d); 36 getchar(); 37 for (i = 0; i < 4; i++) 38 { 39 if (flag == 1) 40 break; 41 for (j = 0; j < 4; j++) 42 { 43 if (flag == 1) 44 break; 45 for (k = 0; k < 4; k++) 46 { 47 if (FullArray(i,j,k) == 1) 48 { 49 printf("24.000\n"); 50 flag = 1; 51 break; 52 } 53 } 54 } 55 } 56 if (flag == 0) 57 { 58 if (flagless == 1) 59 printf("%.3f\n",24-min); 60 else 61 printf("%.3f\n",24+min); 62 } 63 } 64 } 65 66 67 //构造由abcdijk组成的中缀表达式 68 //入口参数:运算符 69 //返回:中缀表达式是否构成了24点 70 int Create(char a[], char b[], char c[],char d[],char i, char j, char k) 71 { 72 int l; 73 for (l = 0; *(s+l) != ‘\0‘; l++) 74 *(s+l) = ‘\0‘; 75 strcpy(s,a); 76 s[strlen(s)] = i; 77 strcat(s,b); 78 s[strlen(s)] = j; 79 strcat(s,c); 80 s[strlen(s)] = k; 81 strcat(s,d); 82 //printf("%s=",s); 83 if(Calculate(s) == 1) 84 return 1; 85 return 0; 86 } 87 88 89 //计算s的值 90 //入口参数:中缀表达式 91 //返回:是否构成24点 92 int Calculate(char *s) 93 { 94 digtop = opetop = 0; //栈顶指针 95 int i, x, neg = 0; // neg == 1 负数 96 for (i = 0; *(s+i) != ‘\0‘; i++) 97 { 98 if (fin[i] == 0) //fin[i] = 1 表示第i位处理完毕 99 { 100 if (s[i] >= ‘0‘ && s[i] <= ‘9‘) //数字直接入栈 101 { 102 x = getdig(i, neg); 103 neg = 0; 104 dig[++digtop] = (double)x; 105 } 106 else 107 { 108 // 两个符号相连,或者第一个字符是符号,证明遇到负数 109 if((i>0 && (!(s[i-1] >= ‘0‘ && s[i-1] <= ‘9‘)))||(i == 0)) 110 neg = 1; 111 else 112 { 113 if (opetop == 0) //运算符栈为空直接入栈 114 ope[++opetop] = s[i]; 115 else 116 { 117 while (pri[ope[opetop]] >= pri[s[i]] && opetop > 0) 118 pop(); 119 ope[++opetop] = s[i]; 120 } 121 } 122 } 123 124 } 125 } 126 127 while (opetop > 0) 128 pop(); 129 130 if (fabs(dig[digtop]-24) < eps) //找到24点 131 return 1; 132 if (fabs(dig[digtop]-24) < min) 133 { 134 min = fabs(dig[digtop]-24); 135 if (dig[digtop] < 24) 136 flagless = 1; 137 else 138 flagless = 0; 139 } 140 //printf("%.3f\n",dig[digtop]); 141 if (fabs(dig[digtop]-24) == min) 142 if (dig[digtop] < 24) 143 flagless = 1; 144 145 for (i = 0; *(s+i) != ‘\0‘; i++) 146 fin[i] = 0; 147 return 0; 148 } 149 150 //弹出两个元素运算 151 //入口参数:无 152 //返回:无 153 void pop(void) 154 { 155 double a, b; 156 char c; 157 a = dig[digtop--]; 158 b = dig[digtop]; 159 c = ope[opetop--]; 160 dig[digtop] = cal(a,b,c); 161 } 162 163 164 //返回从第i位开始的数字 165 //入口参数:数字的第一个字符在字符串s中的位置i 166 //返回:数字 167 int getdig(int i, int neg) 168 { 169 int x = s[i] - 48; 170 fin[i] = 1; 171 while (1) 172 { 173 i++; 174 if (i == strlen(s)) 175 break; 176 if (*(s+i) < ‘0‘ || *(s+i) > ‘9‘) 177 break; 178 fin[i] = 1; 179 x *= 10; 180 x += s[i] - 48; 181 } 182 if (neg == 1) 183 return x*(-1); 184 return x; 185 } 186 187 //计算 188 //入口参数:数 运算符 189 //返回:结果 190 double cal(double x, double y, char c) 191 { 192 switch (c) 193 { 194 case ‘+‘: 195 return x+y; 196 case ‘-‘: 197 return y-x; 198 case ‘*‘: 199 return x*y; 200 case ‘/‘: 201 if (x != 0) 202 return y/x; 203 } 204 return -100000; 205 } 206 207 208 209 //全排列 210 //入口参数:运算符 211 //返回:构成24点返回1 212 int FullArray(int i, int j, int k) 213 { 214 //a 215 if(Create(a,b,c,d,operate[i],operate[j],operate[k]) == 1) return 1; 216 if(Create(a,b,d,c,operate[i],operate[j],operate[k]) == 1) return 1; 217 if(Create(a,c,d,b,operate[i],operate[j],operate[k]) == 1) return 1; 218 if(Create(a,c,b,d,operate[i],operate[j],operate[k]) == 1) return 1; 219 if(Create(a,d,c,b,operate[i],operate[j],operate[k]) == 1) return 1; 220 if(Create(a,d,b,c,operate[i],operate[j],operate[k]) == 1) return 1; 221 //b 222 if(Create(b,a,c,d,operate[i],operate[j],operate[k]) == 1) return 1; 223 if(Create(b,a,d,c,operate[i],operate[j],operate[k]) == 1) return 1; 224 if(Create(b,c,d,a,operate[i],operate[j],operate[k]) == 1) return 1; 225 if(Create(b,c,a,d,operate[i],operate[j],operate[k]) == 1) return 1; 226 if(Create(b,d,a,c,operate[i],operate[j],operate[k]) == 1) return 1; 227 if(Create(b,d,c,a,operate[i],operate[j],operate[k]) == 1) return 1; 228 //c 229 if(Create(c,a,b,d,operate[i],operate[j],operate[k]) == 1) return 1; 230 if(Create(c,a,d,b,operate[i],operate[j],operate[k]) == 1) return 1; 231 if(Create(c,b,d,a,operate[i],operate[j],operate[k]) == 1) return 1; 232 if(Create(c,b,a,d,operate[i],operate[j],operate[k]) == 1) return 1; 233 if(Create(c,d,a,b,operate[i],operate[j],operate[k]) == 1) return 1; 234 if(Create(c,d,b,a,operate[i],operate[j],operate[k]) == 1) return 1; 235 //d 236 if(Create(d,a,b,c,operate[i],operate[j],operate[k]) == 1) return 1; 237 if(Create(d,a,c,b,operate[i],operate[j],operate[k]) == 1) return 1; 238 if(Create(d,b,a,c,operate[i],operate[j],operate[k]) == 1) return 1; 239 if(Create(d,b,c,a,operate[i],operate[j],operate[k]) == 1) return 1; 240 if(Create(d,c,a,b,operate[i],operate[j],operate[k]) == 1) return 1; 241 if(Create(d,c,b,a,operate[i],operate[j],operate[k]) == 1) return 1; 242 243 return 0; 244 }
3、 素数和幸运素数
统计并打印 1 亿以内的所有素数个数,并且打印出 1 千万以上1 亿以内的所有幸运素数(如 11110111 这样仅有 1 位不同,其它位数字都相同的素数),直接打印答案无效。
运行环境:腾讯云 1 核 1 GB 服务器,要求在 5s 之内完成
输入:无
输出:第一行为全部素数数量,之后每行从小到大输出一个幸运素数
输出示例:
576****
1111****
1111****(*为数字,此处隐藏)
*********(还有很多)
让我们复习一下线性筛
/*线性筛,保证每个数只被它最小的因子筛去*/ void Prime(void) { int i, j; tag[0] = tag[1] = 1; for (i = 2; i <= N; i++) { if (tag[i] == 0) prime[cnt++] = i; for (j = 0; j < cnt; j++) { if (i*prime[j] > N) break; tag[i*prime[j]] = 1; if (i % prime[j] == 0) break; } } }
#include <stdio.h> #include <stdlib.h> #define N 100000000 int tag[N]; //tag[i] = 1 代表i不是素数 int prime[N]; int c[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; int cnt = 0; void Prime(void); int Lucky(int); int main() { int i; Prime(); printf("%d\n",cnt); for (i = 665255; i < cnt; i++) if (Lucky(prime[i])) { printf("%d\n",prime[i]); } return 0; } void Prime(void) //线性筛 { int i, j; tag[0] = tag[1] = 1; for (i = 2; i <= N; i++) { if (tag[i] == 0) prime[cnt++] = i; for (j = 0; j < cnt; j++) { if (i*prime[j] > N) break; tag[i*prime[j]] = 1; if (i % prime[j] == 0) break; } } } int Lucky(int x) { int a = x%10, b = 10, m; c[a] ++; x /= 10; while (x != 0) { m = x%10; if (m == a) c[a] ++; if (m != a) { if (b == 10) { b = m; c[b] ++; } else { if (m == b) c[b] ++; if (m != b) { c[a] = 0; c[b] = 0; return 0; } } } x /= 10; } if (c[a] == 1 || c[b] == 1) { c[a] = 0; c[b] = 0; return 1; } c[a] = 0; c[b] = 0; return 0; }
原文地址:https://www.cnblogs.com/liumengyue/p/10045714.html