c語言優化
int com_yi_func(int x)
{
int y;
if(x<1)y=x;
else if(x<10)y=2*x-1;
else y=3*x-11;
return y;
}
說明:
1、x是由參數引入,不用再輸入數字了;
2、返回值是y,不用列印y的值。
② 【50分】c語言程序優化
本題一個完整的c程序如下,在win-tc和Dev-c++下調試通過。
這里沒有使用結構體,也可以改寫為結構體。這里利用的是交換數組的編號,同時程序可以判斷當輸入職工號重復時,提醒重新輸入,效果不錯。
/*職工管理系統
該系統的功能包括輸入、排序、查找。主程序中包括3個函數其中input()函數的功能是:
輸入職工的姓名和職工號。sort()函數的功能是:按職工號由小到大排序,姓名順序也隨之調整。 search()函數的功能是:根據主函數提供的職工號進行查找,若找到該職工則輸出對應職工的姓名, 若找不到則輸出「not find」。
*/
#include<stdio.h>
#include"string.h"
#define NUMMAX 100
int order[NUMMAX];
void input(int a[],char b[][20],int n)
{
int i=0,j,k,flag;
do
{ flag=0;
printf("please input No.%d worker's code:\n",i+1);
scanf("%d",&a[i]);
printf("please input No.%d worker's name:\n",i+1);
scanf("%s",b[i]);
for(j=0;j<i;j++)
{ for(k=j+1;k<i+1;k++)
if(a[k]==a[j])
{ printf("The code has been inputted! Please input again!\n");
flag=1;
break; /*如有重復立即退出該層循環,提高判斷速度*/
}
if(flag==1)
break; /*如有重復立即退出該層循環,提高判斷速度*/
}
if(flag==0)
{ order[i]=i;
i++;
}
}while(i<n);
}
void sort(int a[],int n)
{
int i,j,k;
char t[20];
for(i=0;i<n-1;i++) /* 選擇排序 */
for(j=i+1;j<n;j++)
if(a[order[i]]>a[order[j]]) /* 交換的是次序不是元素 */
{k=order[i]; /* 這是處理不用結構體使數據一起移動的一種好方法 */
order[i]=order[j];
order[j]=k;
}
}
void search(int n,int num,int a[],char b[][20])
{int i,flag=0;
for(i=0;i<n;i++)
if(num==a[order[i]])
{printf("The worker you find is:%s\n",b[order[i]]);
flag=1;
}
if(flag==0)
printf("Not find!\n");
}
int main()
{
char c,name[NUMMAX][20]; /*職工號數值應在int可以表示的范圍內*/
int i,n,code[NUMMAX],num,flag=1;
printf("please input number of workers(<100):\n");
scanf("%d",&n);
input(code,name,n);
sort(code,n);
printf("The sequence of workers after sort are:\n");
for(i=0;i<n;i++)
printf("%-10d%s\n",code[order[i]],name[order[i]]);
while(flag==1)
{
printf("\nInput code to search:");
scanf("%d",&num);
search(n,num,code,name);
printf("\ncontinue or not(Y/N)?");
c=getch();
if(c=='N'||c=='n')
flag=0;
}
return 0;
}
③ C語言編程解決最優化問題
數學計算優化原則:
1.整型數 / Integers
在我們知道使用的數不可能是負數的時候,應該使用unsigned int取代int,一些處理器處理整數算數運算的時候unsigned int比int快,於是,在一個緊致的循環裡面定義一個整型變數,最好這樣寫代碼:
register unsigned int variable_name;
然而,我們不能保證編譯器會注意到那個register關鍵字,也有可能,對某種處理器來說,有沒有unsigned是一樣的。這兩個關鍵字並不是 可以在所有的編譯器中應用。記住,整形數運算要比浮點數運算快得多,因為處理器可以直接進行整型數運算,浮點數運算需要依賴於外部的浮點數處理器或者浮點 數數學庫。我們處理小數的時候要精確點些(比如我們在做一個簡單的統計程序時),要限制結果不能超過100,要盡可能晚的把它轉化成浮點數。
2.除法和余數 / Division and Remainder
在標準的處理器中,根據分子和分母的不同,一個32位的除法需要20-140個時鍾周期來執行完成,等於一個固定的時間加上每個位被除的時間。
Time (分子/ 分母) = C0 + C1* log2 (分子/分母)
= C0 + C1 * (log2 (分子) - log2 (分母)).
現在的 ARM處理器需要消耗20+4.3N個時鍾周期,這是一個非常費時的操作,要盡可能的避免。在有些情況下,除法表達式可以用乘法表達是來重寫。比方說, (a/b)>c可以寫成a>(c*b),條件是我們已經知道b為非負數而且b*c不會超過整型數的取值范圍。如果我們能夠確定其中的一個操作 數為unsigned,那麼使用無符號除法將會更好,因為它要比有符號除法快得多。
3.合並除法運算和取余運算 / Combining division and remainder
在一些情況下,除法運算和取余運算都需要用到,在這種情況下,編譯器會將除法運算和取余運算合並,因為除法運算總是同時返回商和余數。如果兩個運算都要用到,我們可以將他們寫到一起
④ c語言函數優化
c函數是一個獨立的程序段,它執行具體的、明確的任務
特點:
一個函數只能返回一個值
一個程序可以有一個或多個函數
函數可以嵌套調用,但不能在一個函數中定義另一個函數
無論函數是否有參數,一定要有括弧
函數在定義或使用前應在main() 函數中進行聲明
⑤ C語言程序優化評價如何進行
簡單來說,你的程序雖然循環次數少,但是比標准答案多佔用了1倍的內存。這是犧牲空間來提高運行效率的做法,談不上誰好誰壞。
當然,「標准答案」的做法也不是最好的,你可以自己想出來更好的。
⑥ 簡單C語言代碼求優化
我也沒細想,提一個我覺得可行的吧,你在循環里先判斷輸入是0還是1,然後0和1里分別處理,這樣就不用所有情況都做判斷了,可以節省一半的時間
⑦ 幾種C語言優化代碼技巧
以下內容摘自李亞鋒先生的《經典C面試真題精講》
1.結構體設計為成員最長類型長度的整數回倍答;
2.減少函數參數的個數,不需要返回值的函數定義為void類型;
3.if...else....多條件分支語句中,把出現頻率高的條件放在前面;
4.同時聲明多個相同類型變數優於分別單獨聲明變數;
5.減少定義全局變數;
6.使用#define定義常量和小的函數實現;
7.有些情況嵌套匯編語句效率更高;
8.佔用大的存儲空間可以減少執行時間,同理時間也可以換取空間;
9提高程序演算法效率;
⑧ c語言防止優化
編譯器編譯命令里有設置選項,通過設置,你可以要求 不優化,也可以要求用哪種優化。
具體選項有哪些,要查自己編譯器的幫助文件。
例如,MS VC++ 6.0 編譯器編
優化選項:
/O1:優化使產生的可執行代碼最小
/O2:優化使產生的可執行代碼速度最快
/Oa:指示編譯器程序里沒有使用別名,可以提高程序的執行速度
/Ob:控制內聯(inline)函數的展開
/Od:禁止代碼優化
/Og:使用全局優化
/Oi:用內部函數去代替程序里的函數調用,可以使程序運行的更快,但程序的長度變長
/Op:提高浮點數比較運算的一致性
/Os:產生盡可能小的可執行代碼
/Ot:產生盡可能塊的可執行代碼
/Ow:指示編譯器在函數體內部沒有使用別名
/Ox:組合了幾個優化開關,達到盡可能多的優化
/Oy:阻止調用堆棧里創建幀指針
/O2 為了加速,會優化掉。 選 /Od 不優化。
⑨ c語言超時,請幫忙優化
如果你的邏輯沒錯的話,可以考慮將你的判斷語句拿到外面,括弧里就放最終的判斷值就好了
⑩ c語言演算法優化
【演算法描述】
轉某牛人的解題報告!!!!
這道題在沒看數據規模之前以為是一道簡單的DP,但是數據開到十億,無論在時間還是空間復雜度都過大,所以就要進行優化了。
解一:
簡單方法:預期得分30。簡單動態規劃,f[i]代表青蛙跳到i點時所可能踩到的最少石子數,所以有f[i]=min{f[k]+map[i]}(i-s≤k≤i-t),其中map[i]代表i上是否有石子,有是1,否則0。演算法復雜度O(n^2)。
解二:
改進方法:預期得分100。我們會發現,雖然橋很長,但上面最多隻有100個石子,想到能否用石子DP,而應該是不行的。那能否基於第一種方法?由於石子排布非常的疏,我們還會發現,如果兩個石子相隔甚遠,那他們中間的f[i]大部分將會是同一個數,能否把兩個石子的距離縮短,使之還與原來等效?要是行的話怎麼縮?王乃岩同學考試時做了一個方法能夠過全部數據,用的滾動數組存儲,下面列出了他的程序。我自己也寫了個程序,和他不盡相同:我令L=stone[i]-stone[i-1](stone[i]代表按坐標由小到大順序排列的石塊坐標),當L能夠被t整除時(L%t==0),令k=t;當L不能被t整除時(L%t!=0),令k=L%t。然後令k為k+t,最後判斷如果k>L,那麼map[]數組中stone[i]和stone[i-1]兩石頭的距離就被等效成為L(也就是沒變);如果k<=L,那麼map[]數組中stone[i]和stone[i-1]兩石頭的距離就被等效成為k,可以看出來,這樣處理完,兩石子最大間距為2*t,大大的縮短了數組,再按解一進行DP,就可以通過了。
#include <stdio.h>
#include <string.h>
long stone[101];
int map[100001];
int f[100001];
long L;
int S, T, M;
void quickSort(int l, int r)
{
int i , j;
long temp;
i = l;
j = r;
temp = stone[i];
while (i < j)
{
while (i < j && stone[j] > temp)
j--;
if (i < j)
{
stone[i] = stone[j];
i++;
}
while (i < j && stone[i] < temp)
i++;
if (i < j)
{
stone[j] = stone[i];
j--;
}
}
stone[i] = temp;
if (i - 1 > l) quickSort(l, i - 1);
if (i + 1 < r) quickSort(i + 1, r);
}
int main()
{
int i, j;
long l, k, p = 0, min;
scanf("%ld%d%d%d", &L, &S, &T, &M);
for (i = 1; i <= M; i++)
scanf("%ld", &stone[i]);
memset(map, 0, sizeof(int)*100001);
memset(f, 0, sizeof(int)*100001);
quickSort(1, M);
stone[0] = 0;
p = 0;
for (i = 1; i <= M; i++)
{
l = stone[i] - stone[i - 1];
if (l % T == 0)
k = T;
else
k = l % T;
k = k + T;
if (l < k)
k = l;
p = p + k;
map[p] = 1;
}
for (i = 1; i <= p + T; i++)
{
min = 1000;
for (j = i - T; j <= i - S; j++)
if ( j >= 0 && f[j] < min)
min = f[j];
f[i] = min + map[i];
}
min = 1000;
for (i = p + 1; i <= p + T; i++)
if (f[i] < min)
min = f[i];
printf("%d\n", min);
return 0;
}