1. 程式人生 > >藍橋杯 — 加法變乘法(把其中兩個不相鄰的加號變成乘號)

藍橋杯 — 加法變乘法(把其中兩個不相鄰的加號變成乘號)

題目要求如下:


加法變乘法

我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015

比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。

請你尋找另外一個可能的答案,
並把位置靠前的那個乘號左邊的數字提交(對於示例,就是提交10)。

注意:需要你提交的是一個整數,不要填寫任何多餘的內容。

思路:

1.  說思路其實也沒什麼思路,按照正常的解法一步一步的寫出程式來就OK了。

2.  將1+2+3+ ... + 49其中的兩個“+”變成“*”,用雙重迴圈來遍歷所有可能出現的結果。

3.  外層迴圈的變數i代表前一個“*”,內層迴圈中的j代表後一個“*”,依次遍歷。

4.  用變數tmp來儲存將程式中的前一個“+”改變成“*”過後的結果。程式碼為tmp = res = sum-(i+(i-1))+i*(i-1) ,讀者需要仔細理解這句程式碼。

5.  用變數res來儲存將程式中的後一個“+”改變成“*”過後的結果。程式碼為res = tmp-(j+(j-1))+j*(j-1) 。

6.  然後變數res判斷的值是否為2015。如果是,則輸出i和對於j的值。(題目中只要求求出前一個“*”所在的位置,即i的值)。

原始碼如下:

#include <stdio.h>  
int main()  
{  
    int sum = 1225;
	int tmp=0;  //臨時變數,在程式中儲存中間結果 
	int res=0;  //用來儲存將“+”改變成“*”號後的結果 
    for(int i=2; i<=47; ++i)
	 {  
        tmp = res = sum-(i+(i-1))+i*(i-1);  
        
        for(int j=i+2; j<=49; ++j) 
		{  
            res = tmp-(j+(j-1))+j*(j-1);  
            if(res == 2015)
			{  
                printf("(i= %d ,j= %d)\n", i-1,j-1);  
            }    
        }  
    }  
}

執行結果如下:


注:本程式在devc++中通過編譯執行。