代码:
bool IsPrime(int n) { int i; if(n < 2) return false; else if(2 == n) return true; if((n&1) == 0) //n%2 == 0 return false; for(i = 3 ; i*i <= n ; i += 2) //只考虑奇数 { if(n % i == 0) return false; } return true; } /* 考虑到所有大于4的质数,被6除的余数只能是1或者5 比如接下来的5,7,11,13,17,19都满足 所以,我们可以特殊化先判断2和3 但后面的问题就出现了,因为并非简单的递增,从5开始是+2,+4,+2,+4,....这样递增的 这样的话,循环应该怎么写呢? 首先,我们定义一个步长变量step,循环大概是这样 for (i = 5; i <= s; i += step) 那么,就是每次循环,让step从2变4,或者从4变2 于是,可以这么写: */ bool IsPrime2(int n) { int i, step = 4; if(n < 2) return false; else if(2 == n || 3 == n) return true; if((n&1) == 0) //n%2 == 0 return false; if(n%3 == 0) //n%3 == 0 return false; for(i = 5 ; i*i <= n ; i += step) { if(n % i == 0) return false; step ^= 6; } return true; } void print_prime(int n) { int i , num = 0; for(i = 0 ; ; ++i) { if(IsPrime2(i)) { printf("%d " , i); ++num; if(num == n) break; } } printf("\n"); }
void myswap(int a , int b , int* array) { int temp = array[a]; array[a] = array[b]; array[b] = temp; } //利用0和其它数交换位置进行排序 void swap_sort(int* array , int len) { int i , j; for(i = 0 ; i < len ; ++i) //因为只能交换0和其他数,所以先把0找出来 { if(0 == array[i]) { if(i) //如果元素0不再数组的第一个位置 myswap(0 , i , array); break; } } for(i = 1 ; i < len ; ++i) //因为是0至N-1的数,所以N就放在第N的位置处 { if(i != array[i]) //这个很重要,如果i刚好在i处,就不用交换了,否则会出错 { for(j = i + 1 ; j < len ; ++j) { if(i == array[j]) { myswap(0 , j , array); //把0换到j处,此时j处是0 myswap(j , i , array); //把j处的0换到i处,此时i处是0 myswap(0 , i , array); //把i处的0换到0处 } }//for } }//for }
代码:
//转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/8017703 int mymin(int a , int b , int c) { int temp = (a < b ? a : b); return temp < c ? temp : c; } int min_edit_dic(char* source , char* target) { int i , j , edit , ans; int lena , lenb; lena = strlen(source); lenb = strlen(target); int** distance = new int*[lena + 1]; for(i = 0 ; i < lena + 1 ; ++i) distance[i] = new int[lenb + 1]; distance[0][0] = 0; for(i = 1 ; i < lena + 1 ; ++i) distance[i][0] = i; for(j = 1 ; j < lenb + 1 ; ++j) distance[0][j] = j; for(i = 1 ; i < lena + 1 ; ++i) { for(j = 1 ; j < lenb + 1 ; ++j) { if(source[i - 1] == target[j - 1]) edit = 0; else edit = 1; distance[i][j] = mymin(distance[i - 1][j] + 1 , distance[i][j - 1] + 1 , distance[i - 1][j - 1] + edit); //distance[i - 1][j] + 1 插入字符 //distance[i][j - 1] + 1 删除字符 //distance[i - 1][j - 1] + edit 是否需要替换 } } ans = distance[lena][lenb]; for(i = 0 ; i < lena + 1 ; ++i) delete[] distance[i]; delete[] distance; return ans; }