1. 程式人生 > >來自剛剛進入打卡工作的落後者的練習題——06

來自剛剛進入打卡工作的落後者的練習題——06

好體力就要持久學,好習慣就要好堅持,繼續打卡! 這幾天由於種種原因,突然發現,自己做的題好少。 但是,打卡還是必須的,今天的打卡可能混雜各種東西,時間緊迫,望諒解!

第一題:把一個數字用十六進位制、八進位制、二進位制輸出 實話說,剛看見這個題的時候,感覺還行,但是,發現了一個重要的問題,我不會二進位制輸出啊。

下面是具體要求: 9.輸入一個0至255的十進位制整數,分別以十六進位制、八進位制、二進位制數形式輸出該數。 輸入樣例: 58 輸出樣例: 3A 72 111010

所以,想到的第一種方法是高中的除K取餘法。 例如,一個數是23 那麼,除以二是11餘1 之後,除以二是5餘1 之後,除以二是2餘1

之後,除以二是餘01

之後,最後的得數一直往上數,那麼23的二進位制輸出就是10111(反正就是這個意思) 然後,加了一個數組,由於2的8次冪是256,所以陣列的長度是10就可以了,然後把每次除以二的數都存進陣列,之後再逆序輸出就行了。

下面是詳細過程:

#include <stdio.h>
int main ()
{
	int n;
	
	scanf ("%d",&n);
	
	printf ("%x\n",n);
	printf ("%o\n",n);
	
	int i;
	int count=0;
	int sum[10];
	
	for (i=0;i<10;i++)
	{
		sum[i]=n%2;
		
		if (n!=0)
		{
			count++;
		}
		
		n/=2;
	}
	for (i=count-1;i>=0;i--)
	{
		printf ("%d",sum[i]);
	}
	return 0;
}

在這裡面,我加了一個計數器count,這個數是計算位數的,這樣逆序輸出的時候,就不會把陣列之中其他的元素輸出。

but 還沒有結束,下面,還有一種我自己感覺逆天的思路,有一種標頭檔案叫做**#include <stdlib.h>而且,裡面還有一種東西叫做itoa()函式,大致就是這個意思,itoa(x,y,z)裡面的三個數值x,y,z第一個x是你要轉換的數值,之後就是把轉換的數值輸入進y**,而z就是你要轉換的進位制型別。 下面是用**itoa()**函式把一個數轉換成二進位制的方式輸出。

#include <stdio.h>
#include <stdlib.h>
int main ()
{
	int n;
	char str[10];
	
	scanf ("%d",&n);
	
	printf ("%x\n",n);
	printf ("%o\n",n);
	
	itoa(n,str,2);
	printf ("%s",str);
	return 0;
}

相比一下,還是這個東西簡單不少。標頭檔案的作用太大了,以後要了解一下,啊不,要熟練運用

第二題:查詢座位號 (這個題做的我都快瘋了,我是不得不問了呀!) 下面是詳細要求: 輸入格式: 1、輸入第一行給出一個正整數 N(≤1000),隨後 N 行,每行給出一個考生的資訊:准考證號 試機座位號 考試座位號。 其中准考證號由 14 位數字組成,座位從 1 到 N 編號。輸入保證每個人的准考證號都不同,並且任何時候都不會把兩個人分配到同一個座位上。 2、考生資訊之後,給出一個正整數 M(≤N),隨後一行中給出 M 個待查詢的試機座位號碼,以空格分隔。 輸出格式: 對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用 1 個空格分隔。 輸入樣例: 4 10120150912233 2 4 10120150912119 4 1 10120150912126 1 3 10120150912002 3 2 2 3 4 輸出樣例: 10120150912002 2 10120150912119 1 warning:以上都是湊字數,根本沒啥用!

這個題的總體思路就是(你們先看看對不對,要是不對,我再改!) 1、先定義三個陣列number[],Try[],還有test[],分別儲存學號,試機號,還有考試號。 2、之後就是檢查輸入的要查詢的試機號碼了,若是匹配的話,就輸出相應的學號還有考試號。 下面就是我的程式碼了:

#include <stdio.h>
int main ()
{
	int n;
	
	scanf ("%d",&n);
	
	int i;
	int j;
	int Try[n];
	int test[n];
	long long number[n];
	
	for (i=0;i<n;i++)
	{
		scanf ("%lld",&number[i]);
		scanf ("%d %d",&Try[i],&test[i]);
	}
	
	int m;
	
	scanf ("%d",&m);
	
	int a[m];
	
	for (j=0;j<m;j++)
	{
		scanf ("%d",&a[j]);
	}
	for (i=0;i<n;i++)
	{
		for (j=0;j<m;j++)
		{
			if (Try[i]==a[j])
			{
				printf ("%lld %d\n",number[i],test[i]);
			}
		}
	}
	return 0;
}

就是過不了啊,沒有辦法! 顯示的是答案錯誤(但是,自我感覺良好)

第三題:到底有多二 (哎,挺符合我現在的狀態的!什麼都需要靠別人。) 題目要求: 一個整數“犯二的程度”定義為該數字中包含2的個數與其位數的比值。如果這個數是負數,則程度增加0.5倍;如果還是個偶數,則再增加1倍。例如數字-13142223336是個11位數,其中有3個2,並且是負數,也是偶數,則它的犯二程度計算為:3/11×1.5×2×100%,約為81.82%。本題就請你計算一個給定整數到底有多二。 輸入格式: 輸入第一行給出一個不超過50位的整數N。 輸出格式: 在一行中輸出N犯二的程度,保留小數點後兩位。 輸入樣例: -13142223336 輸出樣例: 81.82%

其實這個題不是很難,就是我哪裡可能沒考慮到,使有的地方發生了錯誤, 反正,當局者迷。 思路: 1、先要定義一個字元陣列,儲存當前的數字,但是,在這之前,要先進行陣列的賦值,因為你不知道系統會給陣列賦一個生麼樣的值,我的就是,後面還沒填滿的位置就有一個賦值為9,所以,我把它們都賦值為x(總感覺哪裡很奇怪) 2、後面就是我們偉大的ASCII碼登場的時候了,這裡面的判斷我都用的是每個數字的ASCII碼的序號進行的‘0’是48,後面依次加一。 3、後面我又加了個計數器,因為要計算這個數字的位數,後面好計算 4、還有up是分子,也就是有多少個2 5、判斷是不是奇數(最後一位count-1是不是奇數),判斷是不是負數(第一個字元是不是‘-’) 6、輸出結果。

下面是詳細程式碼:

#include <stdio.h>
int main ()
{
	char num[52];
	int i;
	int cnt=0;
	
	for (i=0;i<51;i++)
	{
		num[i]='x';
	}
	scanf ("%s",num);
	
	int up=0;
	int count=0;
	float sum=1.0;
	
	if (num[0]=='-')
	{
		sum*=1.5;
	}
	
	for (i=0;i<51;i++)
	{
		if (num[i]!='-')
		{
			if (num[i]<58&&num[i]>=48)
			{
				if (num[i]==50)
				{
					up++;
				}
				count++;
			}
			if (num[i]!=120)
			{
				cnt++;
			}
		}
	}
	
	if (num[cnt-1]%2==0)
	{
		sum*=2;
	}
	
	sum*=(up*1.0/count);
	sum*=100;
	
	printf ("%.2f%%",sum);
	
	return 0;
}

這次的打卡比較水,但是,幫別人解決問題,自己也能學到一點東西嘛,所以,希望大家能幫我解決一下。