最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C/C++高精度(加減乘除)算法中的壓位優(yōu)化

 更新時(shí)間:2023年01月31日 09:38:44   作者:CodeOfCC  
在高精度計(jì)算中數(shù)組的每個(gè)元素存儲一位10進(jìn)制的數(shù)字,這樣的存儲方式并不是最優(yōu)的,32位的整型其實(shí)至少可以存儲9位高精度數(shù)字,數(shù)組元素存儲更多的位數(shù)就是壓位優(yōu)化。本文將展示壓位優(yōu)化的原理以及壓9位的實(shí)現(xiàn)和性能對比,需要的可以參考一下

前言

由于上一章《C/C++ 高精度(加減乘除)算法簡單實(shí)現(xiàn)》實(shí)現(xiàn)了基本的高精度計(jì)算,數(shù)組的每個(gè)元素存儲一位10進(jìn)制的數(shù)字。這樣的存儲方式并不是最優(yōu)的,32位的整型其實(shí)至少可以存儲9位高精度數(shù)字,數(shù)組元素存儲更多的位數(shù)就是壓位優(yōu)化。本文將展示壓位優(yōu)化的原理以及壓9位的實(shí)現(xiàn)和性能對比。

一、基本原理

1、存儲方式

壓位優(yōu)化就是將原本存儲一位的數(shù)組元素變成存儲多位,這樣就可以提升運(yùn)算效率,通常最高能存儲9位,如下圖示例為存儲4位。

2、計(jì)算方式

采用模擬立豎式計(jì)算,比如加法的計(jì)算流程,如下圖所示,20481024+80001000=100482024:

二、完整代碼

因?yàn)?strong>接口以及使用方法與上一章《C/C++ 高精度(加減乘除)算法簡單實(shí)現(xiàn)》是完全一致的,所以這里直接展示完整代碼,省略使用示例。下面代碼為壓9位實(shí)現(xiàn)。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdint.h>
/// <summary>
/// 通過字符串初始化
/// </summary>
/// <param name="a">[in]高精度數(shù)組</param>
/// <param name="value">[in]字符串首地址</param>
static void loadStr(int* a, const char* value) {
	int len = strlen(value);
	int left = len % 9;
	char s[8], * p = (char*)value + left;
	a[0] = ceil(len / 9.0);
	len = len / 9.0;
	for (int i = 1; i <= len; i++)
		sscanf(p + (len - i ) * 9, "%09d", &a[i]);
	if (left){
		sprintf(s, "%%0%dd", left);
		sscanf(value, s, &a[a[0]]);
	}
}
/// <summary>
/// 輸出到字符串,
/// </summary>
/// <param name="a">[in]高精度數(shù)組</param>
/// <param name="str">[out]字符串,由外部停供緩沖區(qū),需要保證長度足夠</param>
static void toStr(int* a, char* str) {
	if (!a[0]) {
		sprintf(str, "0");
		return;
	}
	sprintf(str, "%d", a[a[0]]);
	str += strlen(str);
	for (int i = a[0]-1; i > 0; i--)
		sprintf(str +( a[0] -i-1)*9, "%09d", a[i]);
	str[(a[0]-1)*9] = '\0';
}
/// <summary>
/// 通過無符號整型初始化
/// </summary>
/// <param name="a">[in]高精度數(shù)組</param>
/// <param name="value">[in]整型值</param>
static void loadInt(int* a, uint64_t value) {
	a[0] = 0;
	while (value)a[++a[0]] = value % 1000000000, value /= 1000000000;
}

/// <summary>
/// 比較兩個(gè)高精度數(shù)的大小
/// </summary>
/// <param name="a">[in]第一個(gè)數(shù)</param>
/// <param name="b">[in]第二個(gè)數(shù)</param>
/// <returns>1是a>b,0是a==b,-1是a<b</returns>
static int compare(int* a, int* b) {
	if (a[0] > b[0])return 1;
	if (a[0] < b[0])return -1;
	for (int i = a[0]; i > 0; i--)
		if (a[i] > b[i])return 1;
		else if (a[i] < b[i])return -1;
	return 0;
}
/// <summary>
/// 復(fù)制
/// </summary>
/// <param name="a">[in]源</param>
/// <param name="b">[in]目標(biāo)</param>
static void copy(int* a, int* b) {
	memcpy(b, a, (a[0] + 1) * sizeof(int));
}
/// <summary>
/// 打印輸出結(jié)果
/// </summary>
static void print(int* a) {
	int i = a[0];
	printf("%d", a[i--]);
	for (; i > 0; i--)printf("%09d", a[i]);
}

/// <summary>
/// 加
/// </summary>
/// <param name="a">[in]被加數(shù)</param>
/// <param name="b">[in]加數(shù)</param>
/// <param name="c">[out]結(jié)果</param>
static	void plus(int* a, int* b, int* c) {
	int* p;
	if (a[0] < b[0])p = a, a = b, b = p;//確保a長度最大	
	int i = 1, alen = a[0], blen = b[0];
	c[0] = c[alen + 1] = 0;
	if (a != c)memcpy(c + blen + 1, a + blen + 1, (alen - blen) * sizeof(int));//a多出的部分直接拷貝到結(jié)果
	for (; i <= blen; i++) {
		c[i] = a[i] + b[i];
		if (c[i - 1] >= 1000000000)c[i - 1] -= 1000000000, c[i]++;//判斷上一位是否進(jìn)位	
	}
	i--;
	while (c[i++] >= 1000000000)c[i - 1] -= 1000000000, c[i]++;//繼續(xù)判斷進(jìn)位
	c[0] = c[alen + 1] ? alen + 1 : alen;//記錄長度
}
/// <summary>
/// 加等于
///結(jié)果會保存在a中
/// </summary>
/// <param name="a">[in]被加數(shù)</param>
/// <param name="b">[in]加數(shù)</param>
static	void plusq(int* a, int* b) {
	plus(a, b, a);
}

/// <summary>
/// 減
/// </summary>
/// <param name="a">[in]被減數(shù),被減數(shù)必須大于等于減數(shù)</param>
/// <param name="b">[in]減數(shù)</param>
/// <param name="c">[out]結(jié)果</param>
static	void sub(int* a, int* b, int* c) {
	int i = 1, alen = a[0];
	if (a != c)memcpy(c + b[0] + 1, a + b[0] + 1, (a[0] - b[0]) * sizeof(int));//a多出的部分直接拷貝到結(jié)果
	c[0] = 1;
	for (; i <= b[0]; i++) {
		c[i] = a[i] - b[i];
		if (c[i - 1] < 0)c[i - 1] += 1000000000, c[i] --;//判斷上一位是否補(bǔ)位		
	}
	i--;
	while (c[i++] < 0)c[i - 1] += 1000000000, c[i]--;//繼續(xù)判斷補(bǔ)位	
	while (!c[alen--]); c[0] = alen + 1;//記錄長度
}
/// <summary>
/// 減法等于
///結(jié)果會保存在a中
/// </summary>
/// <param name="a">[in]被減數(shù),被減數(shù)必須大于等于減數(shù)</param>
/// <param name="b">[in]減數(shù)</param>
static	void subq(int* a, int* b) {
	sub(a, b, a);
}

/// <summary>
/// 乘
/// </summary>
/// <param name="a">[in]被乘數(shù)</param>
/// <param name="b">[in]乘數(shù)</param>
/// <param name="c">[out]結(jié)果,數(shù)組長度必須大于等于aLen+bLen+1</param>
static	void mul(int* a, int* b, int c[]) {
	int len = a[0] + b[0], d = 0;
	memset(c, 0, sizeof(int) * (len + 1));
	b[b[0] + 1] = 0; c[0] = 1;//防止越界
	for (int i = 1; i <= a[0]; i++)
		for (int j = 1; j <= b[0] + 1; j++){
			int64_t t = (int64_t)a[i] * b[j] + c[j + i - 1] + d;
			c[j + i - 1] = t % 1000000000;
			d = t / 1000000000;
		}
	while (!c[len])len--; c[0] = len;
}
/// <summary>
/// 乘等于
/// 累乘,結(jié)果存放于a
/// </summary>
/// <param name="a">[in]被乘數(shù),數(shù)組長度必須大于等于2aLen+bLen+1</param>
/// <param name="b">[in]乘數(shù)</param>
static	void mulq(int* a, int* b) {
	int* c = a + a[0] + b[0] + 1;
	memcpy(c, a, (a[0] + 1) * sizeof(int));
	mul(c, b, a);
}

/// <summary>
/// 除法
/// 依賴減法subq
/// </summary>
/// <param name="a">[in]被除數(shù),被除數(shù)必須大于除數(shù)</param>
/// <param name="b">[in]除數(shù)</param>
/// <param name="c">[out]商,數(shù)組長度大于等于3aLen-bLen+1</param>
/// <param name="mod">[out]余數(shù),可以為NULL,數(shù)組長度大于等于aLen</param>>
static void div(int* a, int* b, int* c, int* mod) {
	int len = a[0] - b[0] + 1, times, hTimes[32], * temp = c + a[0] + 1;
	if (!mod)mod = temp + 2*(a[0] + 1)+1;//緩沖區(qū)
	memcpy(mod, a, (a[0] + 1) * sizeof(int));
	memset(c, 0, sizeof(int) * (len + 1));
	memset(temp, 0, sizeof(int) * len);
	c[0] = 1;//防止while越界
	for (int i = len; i > 0; i--) {
		memcpy(temp + i, b + 1, sizeof(int) * b[0]);//升階	
		temp[0] = b[0] + i - 1;
		while (compare(mod, temp) != -1) {
			if (times = (mod[mod[0]] * ((mod[0] - temp[0]) ? 1000000000ll : 1)) / (temp[temp[0]] + (temp[0] == 1 ? 0 : 1)))//升倍數(shù)
			{
				loadInt(hTimes,times);
				mulq(temp, hTimes);
			}
			else times = 1;
			while (compare(mod, temp) != -1)subq(mod, temp), c[i] += times;	//減法
			memcpy(temp + i, b + 1, sizeof(int) * b[0]);//還原	
			temp[0] = b[0] + i - 1;
		}
	}
	while (!c[len])len--; c[0] = len;
}
/// <summary>
/// 除等于
/// 商保存在a
/// 依賴div
/// </summary>
/// <param name="a">[in]被除數(shù),被除數(shù)必須大于除數(shù)</param>
/// <param name="b">[in]除數(shù)</param>
/// <param name="mod">[out]余數(shù),可以為NULL,數(shù)組長度大于等于aLen</param>>
static void divq(int* a, int* b, int* mod) {
	div(a, b, a, mod);
}

三、性能對比

測試平臺:Windows 11

測試設(shè)備:i7 8750h

測試方式:測試5次取均值

表1、測試用例

測試用例描述
1整型范圍數(shù)字計(jì)算500000次
2長數(shù)字與整型范圍數(shù)字計(jì)算500000次
3長數(shù)字與長數(shù)字計(jì)算500000次

基于上述用例編寫程序進(jìn)行測試,測試結(jié)果如下表

表2、測試結(jié)果

計(jì)算測試用例1位實(shí)現(xiàn)(上一章)耗時(shí)9位優(yōu)化(本章)耗時(shí)
加法測試用例10.003926s0.002620s
加法測試用例20.026735s0.005711s
加法測試用例30.029378s0.005384s
累加測試用例10.003255s0.002536s
累加測試用例20.017843s0.002592s
累加測試用例30.034025s0.006474s
減法測試用例10.004237s0.002078s
減法測試用例20.024775s0.004939s
減法測試用例30.027634s0.004929s
累減測試用例10.004272s0.002034s
累減測試用例20.0054070.001942s
累減測試用例30.019363s0.004282s
乘法測試用例10.043608s0.004751s
乘法測試用例20.479071s0.028358s
乘法測試用例33.375447s0.064259s
累乘測試用例1 只計(jì)算1000次0.001237s0.000137s
累乘測試用例2 只計(jì)算1000次0.001577s0.000187s
累乘測試用例3 只計(jì)算1000次5.792887s0.081988s
除法測試用例10.025391s0.024763s
除法測試用例25.292809s0.516090s
除法測試用例30.395773s0.073812s
累除測試用例1 只計(jì)算1000次0.059054s0.035722s
累除測試用例2 只計(jì)算1000次0.103727s0.060936s
累除測試用例3 只計(jì)算1000次89.748837s25.126072s

將上表數(shù)據(jù)進(jìn)行分類相同類型取均值計(jì)算出提升速度如下圖所示,僅作參考。

圖1、速度提升

總結(jié)

以上就是今天要講的內(nèi)容,壓位優(yōu)化性能提升是比較顯著的,而且實(shí)現(xiàn)也很容易,大部分邏輯是一致的只是底數(shù)變大了而已。從性能測試結(jié)果來看所有計(jì)算至少由4倍的提升,乘法性能提升較大有可能是測試方法不嚴(yán)重,這個(gè)待以后驗(yàn)證??偟膩碚f,對高精度運(yùn)算進(jìn)行壓位優(yōu)化還是很有必要的,尤其是對時(shí)間和空間有要求的場景還是比較適用的。

附錄 1、性能測試代碼

#include<Windows.h>
#include <iostream>
static int a[819200];
static int b[819200];
static int c[819200];
static int mod[819200];
static char str[81920];
/// <summary>
/// 返回當(dāng)前時(shí)間
/// </summary>
/// <returns>當(dāng)前時(shí)間,單位秒,精度微秒</returns>
static double  getCurrentTime()
{
	LARGE_INTEGER ticks, Frequency;
	QueryPerformanceFrequency(&Frequency);
	QueryPerformanceCounter(&ticks);
	return  (double)ticks.QuadPart / (double)Frequency.QuadPart;
}
/// <summary>
/// 性能測試
/// </summary>
static void test() {
	double d = getCurrentTime();
	loadStr(a, "50000");
	loadInt(b, 50000);
	for (int64_t i = 1; i <= 500000; i++) {
		plus(a, b, c);
	}
	printf("plus  performence   1: %llfs\n", getCurrentTime() - d);
	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadInt(b, 5);
	for (int64_t i = 1; i <= 500000; i++) {
		plus(a, b, c);
	}
	printf("plus  performence   2: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500000; i++) {
		plus(b, a, c);
	}
	printf("plus  performence   3: %llfs\n", getCurrentTime() - d);


	d = getCurrentTime();
	loadStr(a, "50000");
	loadInt(b, 50000);
	for (int64_t i = 1; i <= 500000; i++) {
		plusq(a, b);
	}
	printf("plusq performence   1: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	for (int64_t i = 500000000; i <= 500000000 + 500000; i++) {
		loadInt(b, i);
		plusq(a, b);
	}
	printf("plusq performence   2: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(b, "999999999999999999999999999999999999999999999999999999999999999999");
	for (int64_t i = 500000000; i <= 500000000 + 500000; i++) {
		loadInt(a, i);
		plusq(a, b);

	}
	printf("plusq performence   3: %llfs\n", getCurrentTime() - d);


	d = getCurrentTime();
	loadStr(a, "50000");
	loadInt(b, 10000);
	for (int64_t i = 1; i <= 500000; i++) {
		sub(a, b, c);
	}
	printf("sub   performence   1: %llfs\n", getCurrentTime() - d);



	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadInt(b, 11111);
	for (int64_t i = 1; i <= 500000; i++) {
		sub(a, b, c);
	}
	printf("sub   performence   2: %llfs\n", getCurrentTime() - d);


	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500000; i++) {
		sub(a, b, c);
	}
	printf("sub   performence   3: %llfs\n", getCurrentTime() - d);



	d = getCurrentTime();
	loadStr(a, "50000000000");
	loadInt(b, 500000);
	for (int64_t i = 1; i <= 500000; i++) {
		subq(a, b);
	}
	printf("subq  performence   1: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadInt(b, 11111);
	for (int64_t i = 1; i <= 500000; i++) {
		subq(a, b);
	}
	printf("subq  performence   2: %llfs\n", getCurrentTime() - d);


	
	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500000; i++) {
		subq(a, b);
	}
	printf("subq  performence   3: %llfs\n", getCurrentTime() - d);


	d = getCurrentTime();
	loadStr(a, "50000");
	loadInt(b, 12345);
	for (int64_t i = 1; i <= 500000; i++) {
		mul(a, b, c);
	}
	printf("mul   performence   1: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadInt(b, 12345);
	for (int64_t i = 1; i <= 500000; i++) {
		mul(a, b, c);
	}
	printf("mul   performence   2: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500000; i++) {
		mul(b, a, c);
	}
	printf("mul   performence   3: %llfs\n", getCurrentTime() - d);


	d = getCurrentTime();
	loadStr(a, "2");
	loadInt(b, 2);
	for (int64_t i = 1; i <= 1000; i++) {
		mulq(a, b);
	}
	printf("mulq  performence   1: %llfs\n", getCurrentTime() - d);
	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadInt(b, 2);
	for (int64_t i = 1; i <= 1000; i++) {
		mulq(a, b);
	}
	printf("mulq  performence   2: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 1000; i++) {
		mulq(b, a);
	}
	printf("mulq  performence   3: %llfs\n", getCurrentTime() - d);



	d = getCurrentTime();
	loadStr(a, "50000");
	loadInt(b, 12345);
	for (int64_t i = 1; i <= 500000; i++) {
		div(a, b, c, mod);
	}
	printf("div   performence   1: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadInt(b, 12345);
	for (int64_t i = 1; i <= 500000; i++) {
		div(a, b, c, NULL);
	}
	printf("div   performence   2: %llfs\n", getCurrentTime() - d);

	d = getCurrentTime();
	loadStr(a, "100000000000000000000000000000000000000000000000000000000000000000");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500000; i++) {
		div(a, b, c, mod);
	}
	printf("div   performence   3: %llfs\n", getCurrentTime() - d);



	loadStr(a, "1");
	loadStr(b, "2");
	for (int64_t i = 1; i <= 1000; i++) {
		mulq(a, b);
	}
	d = getCurrentTime();
	for (int64_t i = 1; i <= 1000; i++) {
		divq(a, b, mod);
	}
	printf("divq  performence   1: %llfs\n", getCurrentTime() - d);

	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadStr(b, "2");
	for (int64_t i = 1; i <= 1000; i++) {
		mulq(a, b);
	}
	d = getCurrentTime();
	for (int64_t i = 1; i <= 1000; i++) {
		divq(a, b, mod);
	}
	printf("divq  performence   2: %llfs\n", getCurrentTime() - d);



	loadStr(a, "999999999999999999999999999999999999999999999999999999999999999999");
	loadStr(b, "11111111111111111111111111111111111111");
	for (int64_t i = 1; i <= 500; i++) {
		mulq(a, b);
	}
	d = getCurrentTime();
	for (int64_t i = 1; i <= 500; i++) {
		divq(a, b, mod);
	}
	printf("divq  performence   3: %llfs\n", getCurrentTime() - d);
}

到此這篇關(guān)于詳解C/C++高精度(加減乘除)算法中的壓位優(yōu)化的文章就介紹到這了,更多相關(guān)C++壓位優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 學(xué)習(xí)C語言要掌握的幾個(gè)庫

    學(xué)習(xí)C語言要掌握的幾個(gè)庫

    本文給大家分享的是網(wǎng)友提出的學(xué)習(xí)C語言要掌握的幾個(gè)庫,這里分享給大家,有需要的小伙伴可以參考下。
    2015-07-07
  • OpenSSL使用AES實(shí)現(xiàn)文件加解密功能

    OpenSSL使用AES實(shí)現(xiàn)文件加解密功能

    AES是一種對稱加密算法,它是目前廣泛使用的加密算法之一,意味著加密和解密使用相同的密鑰,這就要求密鑰的安全性非常重要,因?yàn)槿魏螕碛忻荑€的人都能進(jìn)行加密和解密操作,本文給大家介紹了OpenSSL如何使用AES實(shí)現(xiàn)文件加解密功能,需要的朋友可以參考下
    2023-11-11
  • c語言實(shí)現(xiàn)簡易版三子棋(附完整代碼)

    c語言實(shí)現(xiàn)簡易版三子棋(附完整代碼)

    大家好,本篇文章主要講的是c語言實(shí)現(xiàn)簡易版三子棋(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++ 結(jié)構(gòu)體初始化與賦值詳解

    C++ 結(jié)構(gòu)體初始化與賦值詳解

    本文主要介紹了C++ 結(jié)構(gòu)體初始化與賦值詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++下標(biāo)運(yùn)算符詳解

    C++下標(biāo)運(yùn)算符詳解

    C語言中的下標(biāo)運(yùn)算符用于訪問數(shù)組或指針變量中的元素,它使用方括號 [] 來表示,并在方括號內(nèi)指定元素的索引位置,本文給大家詳細(xì)的講解一下C++的下標(biāo)運(yùn)算符,需要的朋友可以參考下
    2023-09-09
  • C++基于隨機(jī)數(shù)實(shí)現(xiàn)福彩雙色球的方法示例

    C++基于隨機(jī)數(shù)實(shí)現(xiàn)福彩雙色球的方法示例

    這篇文章主要介紹了C++基于隨機(jī)數(shù)實(shí)現(xiàn)福彩雙色球的方法,結(jié)合完整實(shí)例形式分析了C++隨機(jī)數(shù)算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-06-06
  • 通過stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼

    通過stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼

    在本篇文章里小編給大家分享了關(guān)于通過stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼內(nèi)容,需要的朋友們可以參考下。
    2020-04-04
  • 詳解C++中特殊類設(shè)計(jì)

    詳解C++中特殊類設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++中關(guān)于特殊類設(shè)計(jì)的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • C語言算法打卡回文串驗(yàn)證算法題解

    C語言算法打卡回文串驗(yàn)證算法題解

    這篇文章主要為大家介紹了C語言算法打卡萬人千提的leetcode回文串的驗(yàn)證算法題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C字符串操作函數(shù)實(shí)現(xiàn)方法小結(jié)

    C字符串操作函數(shù)實(shí)現(xiàn)方法小結(jié)

    這篇文章主要介紹了C字符串操作函數(shù)實(shí)現(xiàn)方法,實(shí)例總結(jié)了C語言字符串操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評論

泗洪县| 双牌县| 房山区| 宝坻区| 京山县| 元朗区| 遵化市| 翼城县| 隆尧县| 清徐县| 托克托县| 尉犁县| 松江区| 惠安县| 江阴市| 鞍山市| 织金县| 阜南县| 额敏县| 大理市| 云安县| 博客| 宜阳县| 朝阳区| 东山县| 海淀区| 阜南县| 建始县| 平昌县| 子长县| 岗巴县| 旅游| 诏安县| 荔浦县| 台江县| 文安县| 德兴市| 武城县| 来安县| 明水县| 盐城市|