1. 程式人生 > >智能車任務四

智能車任務四

打印 break 文件中 fclose tag 要求 main getchar 返回

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;
}

智能車任務四