1. 程式人生 > >PAT考試乙級1005(C語言實現)

PAT考試乙級1005(C語言實現)

#include<stdio.h>

int main(){
    int num=0,i=0,n[1000]={0},a[101]={0},count=0;
    scanf("%d",&num);
    if(num<100){
        for(i=0;i<num;i++){
            scanf("%d",&n[i]);
            //printf("%d\n",n[i]);
            if(n[i]>1&&n[i]<=100){
                a[n[i]]=1;
            }
        }
        for
(i=0;i<num;i++){ while(n[i]!=1){ if(n[i]%2==0){ n[i]/=2; //printf("%d\n",n[i]); if(n[i]<=100){ a[n[i]]=0; } }else{ n[i]=(3*n[i]+1)/2; //printf
("%d\n",n[i]); if(n[i]<=100){ a[n[i]]=0; } } } } } for(i=101;i>0;i--){ if(a[i]==1){ if(count>0){ printf(" "); } printf("%d",i); count++; } } return
0; }

總結:
1、判斷數字是否已經被計算過,在一個數組中採用0,1標識,這個想法很重要。
2、兩個迴圈不可以寫在一起:for(i=0;i<num;i++){}
主要原因是第一次迴圈主要是把輸入數字標記到 a[]陣列,在迴圈還沒有結束的時候,a[]沒有標記完成,在a[]沒有標記完成的情況下就對n[]陣列進行操作以及對a[]陣列賦值,不正確。
易錯點:
1、讀資料時,讀整數時,千萬不要遺漏&。
2、題目要求輸出從大到小排列,因此列印迴圈i從後往前,一舉兩得。
3、在提交程式碼的時候,發現結果是部分正確,這是由於某個判斷條件不全引起的,猜想測試用例應該大部分是在邊緣值或邊緣條件。

相關推薦

PAT考試乙級1005(C語言實現)

#include<stdio.h> int main(){ int num=0,i=0,n[1000]={0},a[101]={0},count=0; scanf("%d",&num); if(num<100)

PAT考試乙級1014(C語言實現) 部分正確

#include<stdio.h> #include <string.h> int main(){ int i,l1,l2; char s1[61],s2[61],s3[61],s4[61]; scanf("%s%

PAT考試乙級1018(C語言實現)

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示: 現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。 輸入格式: 輸入第1行給出正整數N(<=105),即雙方交鋒的次數。隨後N行,每行

PAT考試乙級1007(C語言實現)

#include<stdio.h> #include<math.h> int main(){ int num,i,j,t=0,s[100000]={0},count=0; scanf("%d",&num);

PAT考試乙級1010(C語言實現)

#include<stdio.h> int main(){ int a=0,b=0,flag=0; char ch; do{ scanf("%d %d",&a,&b); ch

PAT考試乙級1027(C語言實現)

#include<stdio.h> #include<math.h> int main(){ int n,m,t,i,j; char c; scanf("%d %c",&n,&c); m=1

PAT考試乙級1017(C語言實現)

#include<stdio.h> #include<string.h> int main(){ char A[1001]={0},Q[1001]={0};//注意陣列初始值 int B=0,R=0,i=0,j=0;

PAT】甲級1002——C語言實現

This time, you are supposed to find A+B where A and B are two polynomials.InputEach input file contains one test case. Each case occupies 2 lines, and each

PAT】甲級1001——C語言實現

Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than f

PAT 乙等 1005 C語言

1005. 繼續(3n+1)猜想 (25) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4

pat乙級1084 外觀數列(c語言實現

#include<stdio.h>#include<string.h>#define MAXN 100005char s[MAXN],t[MAXN];char *ps,*pt;main(){    char now;//µ±Ç°¼ÆÊýint num,

PAT 乙級 1001——1005 C語言

以下是我刷PAT乙級的一些總結,不足之處,請各路大神不吝賜教! 1001 題目:害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這

pat 乙級1082 射擊比賽(c語言實現

#include<stdio.h>#include<stdlib.h>typedef struct d{int id;int grade;}man;int cmp(const void*a,const void*b){man s1=*(man*)a;m

PAT乙級)1065 單身狗(C語言實現

總結: 1、我最初的想法是一遍遍去遍歷,但其實自己心裡也清楚這樣迴圈層數多,容易執行超時,所以以下思路借鑑柳婼小姐姐。 思路:定義情侶陣列couple[ ]={-1},每個人對應的編號的陣列儲存自己情侶的編號。這樣有情侶的人對應的初值不再是-1,其他對應值仍是-1

PAT乙級)1002 寫出這個數(C語言實現

總結:1、關鍵點在於:求出和sum之後怎麼將其輸出成拼音的問題。這裡巧妙地運用了一個函式:sprintf(str,“%d”,num);即                   和printf的使用時一樣的,只不過printf是將num輸出到螢幕上,sprintf將num列印

PAT乙級)1020 月餅(C語言實現

總結: 1、其實思路跟“德才論”那題很像。對每一種類月餅建立結構體變數,然後使用qsort函式按照月餅單售價排序,計算總價時,如果單售價最高的月餅庫存量<=最大需求量,即可以售光該類月餅,最大需求量-庫存量後再進行單售價次之的判斷;否則,只能售出最大需求量*單價。

PAT乙級)1003 我要通過!(C語言實現

總結:1、重要的是找規律。即: 形如 xPATx 的字串正確的有: PAT、APATA、AAPATAA、AAAPATAAA,就是中間一個A左右加上等量的A(不加也行)都是正確的。 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,拿上面的那幾個正確的

PAT Basic 1005. 繼續(3n+1)猜想(C語言實現

題目 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進

PAT乙級)1007 素數對猜想(C語言實現

總結:關鍵在於判斷是不是素數的程式碼段可以作為常識記憶,即: for(i=3;i<=n;i++)   {     k=sqrt(i);     for(j=2;j<=k;j++)     {       if(i%j==0)       break;   

PAT乙級)1032 挖掘機技術哪家強(C語言實現

總結: 1、求對應相同編號的分數總和時,一開始我是想分開用陣列儲存編號和對應的分數和,這樣操作既複雜然後又沒通過測試,看了大佬的想法,直接用編號作為陣列的位號,去儲存對應的分數和,會簡單很多。 2、特別要注意陣列的上下界和迴圈的次數,不然會造成結果錯誤。