1. 程式人生 > >演算法的樂趣c/c++ —— 1.1.6入門習題

演算法的樂趣c/c++ —— 1.1.6入門習題

宣告:摘選自“ 演算法競賽入門經典(第2版)”作者:  劉汝佳  /  陳鋒   ISBN:9787302291077

生成元 

     如果x加上x的各個數字之和得到y,就說x是y的生成元。給出n(1≤n≤100000),求最小生成元。無解輸出0.例如,n = 216,121 ,2005年時的解分別為198,0,1979。
解題思路:

這種題其實可以很簡單的做出來,首先你給定的數字一定是大於元的,只要你從數字1開始暴力列舉至給定的數字,就一定能夠得到你所需要的元。假如給定的數字是10萬,那麼你就最多需要列舉100000次。每輸入一次,你就要從零開始重新列舉,這確實可以獲得正確答案,但這顯然會極大地消耗時間。演算法要求的是。高效快捷的解決問題如果我們一開始就把0-100000所有的數字全部求得他的Y,然後儲存在數組裡面,接下來只需要遍歷搜尋就可以了。我們只是在是程式開始的時候執行一次計算,剩下的運算只是遍歷,這樣會極大地減少運算時間。

#include<stdio.h>
int list[100010];  //用於存放 元 的陣列 
int main()
{
	int H, L;    //定義H來表示減掉個位數的剩餘位數,L表示低位數 
	for(int i=1; i<=100000; i++)
	{
		int sum = 0;  //用於計算各個數字的和 
		H = i;        //將 i 賦值給 H 這樣就可以 將i不斷的分解 
		while(H > 0)  //用於分解大數字,變成單個數字 
		{
			L = H % 10;  //用於記錄個位數
			H = H / 10;  //用於記錄剩下的數字 
			sum += L;    //將各個數字加起來 
		}
		list[i] = sum + i;    // 將求得的數字存放進陣列 
	}
	int n;   //輸入的數字n 
	while(scanf("%d", &n) == 1 && n)    //一次只能輸入一個數字,當輸入n=0時,停止迴圈程式 
	{
		int m = 0;
		for(int i=0; i<n; i++)
		{
			if(list[i] == n) 
			{
				printf("%d\n", i); 
				m+=1;
				break;
			}
		}
		if(m == 0) printf("0\n");
	} 
	 
}