演算法的樂趣c/c++ —— 1.1.6入門習題
阿新 • • 發佈:2018-12-26
宣告:摘選自“ 演算法競賽入門經典(第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"); } }