㈠ 幾種c語言優化代碼技巧
以下內容摘自李亞鋒先生的《經典C面試真題精講》
1.結構體設計為成員最長類型長度的整數倍;
2.減少函數參數的個數,不需要返回值的函數定義為void類型;
3.if...else....多條件分支語句中,把出現頻率高的條件放在前面;
4.同時聲明多個相同類型變數優於分別單獨聲明變數;
5.減少定義全局變數;
6.使用#define定義常量和小的函數實現;
7.有些情況嵌套匯編語句效率更高;
8.佔用大的存儲空間可以減少執行時間,同理時間也可以換取空間;
9提高程序演算法效率;
㈡ 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;
}
㈢ c語言代碼優化
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void main()
{
int i,j,m,n,result;
void tsy(int n);
srand(time(NULL));
i=1+rand()%3;
j=4+rand()%3; //這里除3餘數
m=1+rand()%9;
n=1+rand()%9;
printf("%d*%d\n",m,n);
printf("enter result:\n");
scanf("%d",&result);
if((m*n)==result)tsy(i);
else tsy(j);
printf("\n");
}
void tsy(int n)
{
switch(n)
{
case 1:{printf("Very good!\n");break;}
case 2:{printf("Excellent!\n");break;}
case 3:{printf("Keep up the good work!\n");break;}
case 4:{printf("No,please try again!\n");break;}
case 5:{printf("Wrong ,Try once more!\n");break;}
case 6:{printf("No.keep trying!\n");break;}
default:break;
}
}
㈣ 這個C語言程序怎麼優化比較好
緩沖區、內存拷貝的話,直接用 內存拷貝函數 memcpy即可, 使用C標准庫中的函數比較簡潔。
自己寫的話,把函數聲明放在源文件的最上面比較直觀。
㈤ C語言 最優化問題
這個code就是要表達一下的思維:
每一個訂單是用一個長達200寬度的數字array 來表達的.
這有N個這樣的訂單.
每一個array, 我們在客戶需要使用房間的那幾天我們做如下行為:
我們表明每一天此客戶需要使用多少個房間..如果是3個就是3個.
我們處理這個2維列陣如下:
把它畫出來, 我們把每一列上面的數字都加起來, 從1到200, 然後一個一個比較, 算出來最大的那個總合. 那就是我們要的答案.
#include <iostream>
using namespace std;
int main (void) {
//樣本數量
int N, iterator;
cin >> N;
iterator = 0;
/*最多是從第180天開始做20天*/
/*然後這里有N個訂單*/
int howShouldINameThis[N][200];
/*每一個訂單是用一個列陣來代表的*/
/*下面這些編碼主要的意思就是將每一個列陣中客戶要用房間的那些天做如下標記*/
/*如果他每天要用3個房間, 那麼他/她要用房間的那些天就會全部被寫上3*/
/*下面的編碼會吸收所有的輸入*/
while ( iterator < N ) {
int num1, num2, num3, sum;
cin >> num1 >> num2 >> num3;
sum = num2 + num3;
for ( num2; num2 < sum; num2 ++ )
{
howShouldINameThis[iterator][num2] = num1;
}
iterator ++;
}
/*此時我們有一個2維列陣,和N訂單數量.*/
int minRoomRequirement = 0, temp = 0;
for (int i = 0; i < 200; i ++) {
for (int i2 = 0; i2 < N; i2 ++) {
temp += howShouldINameThis[i2][i]
}
if ( temp > minRoomRequirement )
minRoomRequirement = temp;
}
/*minRoomRequirement這個時候有你需要的答案*/
cout << minRoomRequirement << endl;
return 0;
}
㈥ C語言演算法時間優化問題
1、所有m個數據讀入之後再一起統一排序,可以調用qsort或者自己寫簡單的冒泡,10萬個以內應該很快的。
2、查詢採用折半法,找到一個之後往前往後看看有多少個相同的。(或者先對步驟1的結果進行歸並,然後再折半查詢。具體看q的數量,如果不大的話就用前一種直接查,如果q和m相近也很大的,那麼採用後一種。)
㈦ 簡述C語言程序代碼優化的幾種方法
具體問題具體分析……或者看看重構方面的書籍。
㈧ 緊急求助C語言描述的數據結構,中的有一個查找方式是用一個虛擬的哨兵元素來優化演算法
這個屬於順序表的查找
typedef int Elemtype;
//定義靜態查找表的順序存儲結構
typedef struct
{
Elemtype key;
}Elem;
typedef struct
{
Elem *elem;//存儲空間基址
int length;//表的長度
}SSTable;
bool EQ(Elemtype key1,Elemtype key2)
{
if(key1==key2)
{
return true;
}
return false;
}
//下面是查找函數
int Search_Seq(SSTable ST, KeyType Key)
{
ST.elem[0].key=key;
for(i=ST.length;!EQ(ST.elem[i].key,key);--i);
return i;
}
我這里是將Elemtype定義為int 的,如果要定義為char,則應相應的更改EQ函數
㈨ 如果C語言函數參數太多,可以怎麼優化
一個函數的參數的數目沒有明確的限制,但是參數過多(例如超過8個)顯然是一種不可取的編程風格。參數的數目直接影響調用函數的速度,參數越多,調用函數就越慢。另一方面,參數的數目少,程序就顯得精練、簡潔,這有助於檢查和發現程序中的錯誤。因此,通常應該盡可能減少參數的數目,如果一個函數的參數超過4個,你就應該考慮一下函數是否編寫得當。 如果一個函數不得不使用很多參數,你可以定義一個結構來容納這些參數,這是一種非常好的解決方法。在下例中,函數print_report()需要使用10個參數,然而在它的說明中並沒有列出這些參數,而是通過一個RPT_PARMS結構得到這些參數。 # include <atdio. h> typedef struct ( int orientation ; char rpt_name[25]; char rpt_path[40]; int destination; char output_file[25]; int starting_page; int ending_page; char db_name[25]; char db_path[40]; int draft_quality; )RPT_PARMS; void main (void); int print_report (RPT_PARMS* ); void main (void) { RPT_PARMS rpt_parm; /*define the report parameter structure variable * / /* set up the report parameter structure variable to pass to the print_report 0 function */ rpt_parm. orientation = ORIENT_LANDSCAPE; rpt_parm.rpt_name = "QSALES.RPT"; rpt_parm. rpt_path = "Ci\REPORTS" rpt_parm. destination == DEST_FILE; rpt_parm. output_file = "QSALES. TXT" ; rpt_parm. starting_page = 1; rpt_pann. ending_page = RPT_END; rpt_pann.db_name = "SALES. DB"; rpt_parm.db_path = "Ci\DATA"; rpt_pann. draft_quality = TRUE; /*call the print_report 0 function; paaaing it a pointer to the parameteM inatead of paMing it a long liat of 10 aeparate parameteM. * / ret_code = print_report(cu*pt_parm); } int print_report(RPT_PARMS*p) { int rc; /*acccM the report parametcra paaaed to the print_report() function */ oricnt_printcr(p->orientation); Kt_printer_quality((p->draft_quality == TRUE) ? DRAFT ; NORMAL); return rc; } 上例唯一的不足是編譯程序無法檢查引用print_report()函數時RPT_PARMS結構的10個成員是否符合要求。